En Debian, ¿cómo puedo crear un script que vuelva a ejecutar un programa Java después de que se haya detenido o haya fallado?

En Debian, ¿cómo puedo crear un script que vuelva a ejecutar un programa Java después de que se haya detenido o haya fallado?

Estoy ejecutando un programa de servidor Java que debe iniciarse con un script de shell. El script debe iniciar el programa Java nuevamente si falla o se detiene manualmente.

Encontré este script en línea para ello.

while true
do
   java -jar program.jar
done

Pero eso no pareció funcionar en mi caja Debian 7; solo muestra:

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

Eso acaba de publicarse como un script "Linux". ¿Cómo puedo hacer que funcione en Debian? Ah, sí, y es importante que el programa se inicie desde el script porque necesito acceder a su consola con regularidad, a menos que haya una manera de que no sea un script pero aún así me permita acceder a su consola.

Respuesta1

Ése es un guión perfectamente válido. Funcionaría bien en cualquier lugar. Si recibe un error de sintaxis, es porque se introdujo un error de sintaxis al copiar/pegar el script o, como Thomas teorizó en los comentarios, su archivo está usando terminadores de línea incorrectos.

Puede verificar los terminadores de línea usando el odcomando, como este:

$ 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

Puede ver aquí que el script en mi sistema usa nuevas líneas (eso está nlen el resultado, justo después de, t r u epor ejemplo). Si en lugar de eso ves solo retornos de carro:

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

O combinaciones de retorno de carro/nueva línea:

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

Entonces tendrás que arreglar eso.

Una vez que todo funcione, es posible que desees considerar agregar un sleepcomando a tu script, como este:

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

En caso de que program.jarfalle inmediatamente, el circuito cerrado sin pausas puede consumir una gran cantidad de CPU. Introducir una pequeña pausa resuelve en gran medida esa preocupación particular.

Respuesta2

La respuesta de Larsks está bien escrita y es extensa. En consecuencia, se ha votado a favor.

Sólo una nota rápida sobre:

Entonces tendrás que arreglar eso.

Hay innumerables formas de convertir Windows CR a Linux/Unix LF. Éstos son algunos:
Usando tr:

tr -d '\r' < infile > outfile

Usando sed:

sed 's/^M$//' infile > outfile

Por último, como estás en Debian, es posible que tengas un paquete llamado dos2unixdisponible. Si lo instalas es tan sencillo como:

dos2unix myfile

información relacionada