¿Volver a ejecutar un script de aplicación cuando se bloquea?

18

Tengo algunas aplicaciones que necesitan ejecutarse en mi computadora portátil todo el tiempo.

Yo uso un script bash para iniciar estas aplicaciones. En mi script tengo un bucle que se parece a esto:

while true;
do
    xterm
done

Esto ejecuta una aplicación ( xtermen este caso) y si la aplicación falla, el bucle comienza de nuevo.

Esto tiene la desventaja de que no hay una salida "limpia" de este bucle. Entonces, incluso si la intención del usuario es cerrar xterm, el ciclo comienza de nuevo.

¿Hay alguna manera de iniciar una aplicación desde el script bash, observar si se está ejecutando, volver a ejecutarla si el script falla o no hacer nada si el usuario la cerró correctamente?

Dictador
fuente

Respuestas:

30

Prueba esto:

while true; do xterm && break; done

Las aplicaciones tienen códigos de estado de salida, de modo que si algo sale bien, devuelve cero ... Y si algo salió mal, arroja otro número. Esto permite que las personas se conecten y descubran el problema exacto. Esto es lo que está haciendo la otra respuesta.

&&solo comprueba que el comando anterior era una salida de estado cero y, si lo era, rompe el ciclo. Si se bloquea, arrojará algo distinto de 0 y la && ...cláusula no se activará; simplemente dará vueltas y correrá xterm.

Ciro
fuente
66
Eso es muy elegante.
Oli
Hmm .. Al revés también:while xterm; do true; done
Muru
1
@muru: Esto funciona para mí:while ! xterm; do :; done
Cyrus
1
@ Cyrus Ah, sí. olvidó el !.
muru
He creado un monstruo. ¿Cómo lo mato?
Tony Ruth
6

En la whilecondición, puede probar si el estado de salida de xtermfue exitoso o no con algo como esto:

result=1
while [ $result -ne 0 ]; do
    xterm
    result=$?
done

$? La variable contiene el estado de salida del último comando ejecutado.

Leonid V. Fedorenchik
fuente
0

Te sugiero que uses.

hasta xterm; ¿echo "el programa terminó con el estado $?" ; hecho

Esto volverá a ejecutar su programa si se mata.

Aravind Ekan
fuente
0

Intente usar supervisor, es muy simple y fácil agregar un programa o script para ejecutar . En su caso, lo mínimo que necesita commandy tal vez exitcodesen la sección programx para configurar.

El valor predeterminado exitcodeses 0,2, por lo que significa:

El supervisor reiniciará el proceso si sale con un código de salida que no está definido en esta lista

En general, es lo que desea: vuelva a ejecutarlo si el script se bloqueó o no haga nada si el usuario lo cerró correctamente (o el script se completó correctamente)

pruebe la configuración más simple primero:

[program:you_app_name]
command=/path/to/you/app

Para mayor flexibilidad, consulte la documentación del archivo de configuración .

Максим Шатов
fuente