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 od
comando, 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á nl
en el resultado, justo después de, t r u e
por 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 sleep
comando a tu script, como este:
while true
do
java -jar program.jar
sleep 1
done
En caso de que program.jar
falle 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 dos2unix
disponible. Si lo instalas es tan sencillo como:
dos2unix myfile