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 od
comando, 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 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á consertar isso.
Depois de fazer as coisas funcionarem, você pode considerar adicionar um sleep
comando ao seu script, como este:
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.
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 dos2unix
disponível. Se você instalá-lo, é tão simples quanto:
dos2unix myfile