No Debian, como faço um script que reexecute um programa Java depois que ele tenha parado ou travado?

3

Estou executando um programa de servidor Java que precisa ser iniciado com um script de shell. O script precisa iniciar o programa Java novamente se ele falhar ou ser interrompido manualmente.

Eu encontrei este script online para ele

while true
do
   java -jar program.jar
done

Mas isso não parece funcionar na minha caixa Debian 7; apenas mostra:

./start.sh: line 4: syntax error: unexpected end of file

Isso foi postado apenas como um script "Linux". Como posso fazer funcionar no Debian? Ah, sim, e é importante que o programa seja iniciado a partir do script, pois preciso acessar seu console regularmente, a menos que haja uma maneira de ele não ser um script, mas ainda assim permitir que eu acesse seu console.

    
por Tundral 24.09.2016 / 15:33

2 respostas

2

Esse é um script perfeitamente válido. Funcionaria bem em qualquer lugar. Se você está recebendo um erro de sintaxe, é porque houve um erro de sintaxe introduzido quando você copiou / colou o script ou como Thomas teorizou nos comentários que seu arquivo está usando terminadores de linha incorretos.

Você pode verificar os terminadores de linha usando o comando od , desta forma:

$ od -a foo.sh 
0000000   w   h   i   l   e  sp   t   r   u   e  nl   d   o  nl  sp  sp
0000020  sp   j   a   v   a  sp   -   j   a   r  sp   p   r   o   g   r
0000040   a   m   .   j   a   r  nl   d   o   n   e  nl
0000054

Você pode ver aqui que o script no meu sistema está usando novas linhas (esse é o nl na saída, logo após, t r u e , por exemplo). Se, em vez disso, você vir apenas retornos de carro:

0000000   w   h   i   l   e  sp   t   r   u   e  cr   d   o  cr  sp  sp

Ou combinações de retorno de carro / nova linha:

0000000   w   h   i   l   e  sp   t   r   u   e  cr  nl   d   o  cr  nl

Então você precisará corrigir isso.

Depois de fazer as coisas funcionarem, você pode considerar adicionar um comando sleep ao seu script, assim:

while true
do
   java -jar program.jar
   sleep 1
done

No caso de program.jar travar imediatamente, o loop apertado sem pausas pode consumir muita CPU. A introdução de uma pequena pausa resolve em grande parte essa preocupação específica.

    
por 24.09.2016 / 16:29
0
A resposta de

larsks é bem escrita e extensa. O voto positivo foi dado de acordo.

Apenas uma nota rápida sobre:

Then you will need to fix that.

Existem inúmeras maneiras de converter o Windows CR para Linux / Unix LF. Aqui estão alguns:
Usando tr :

tr -d '\r' < infile > outfile

Usando sed :

sed 's/^M$//' infile > outfile
Por último, como você está no Debian, você pode ter um pacote chamado dos2unix available. Se você instalá-lo, é tão simples como:

dos2unix myfile
    
por 24.09.2016 / 18:43