No Debian, como faço um script que irá executar novamente um programa Java depois que ele for interrompido ou travado?

No Debian, como faço um script que irá executar novamente um programa Java depois que ele for interrompido ou travado?

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 travar ou for interrompido manualmente.

Encontrei esse script online para isso

while true
do
   java -jar program.jar
done

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

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

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

Responder1

Esse é um script perfeitamente válido. Funcionaria bem em qualquer lugar. Se você estiver 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, seu arquivo está usando terminadores de linha incorretos.

Você pode verificar os terminadores de linha usando o odcomando, assim:

$ 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 (que estão nlna saída, logo após, t r u epor 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á consertar isso.

Depois de fazer as coisas funcionarem, você pode considerar adicionar um sleepcomando ao seu script, como este:

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

No caso de program.jartravar 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.

Responder2

A resposta de Larsks é bem escrita e extensa. O voto positivo foi dado em conformidade.

Apenas uma observação rápida sobre:

Então você precisará consertar isso.

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 dos2unixdisponível. Se você instalá-lo, é tão simples quanto:

dos2unix myfile

informação relacionada