Crear un script Bash que ejecutará un programa y si sale sin fallar, lo ejecutará nuevamente

8

Me gustaría conocer la forma más fácil de crear un script bash que ejecute una aplicación en MacOSX (es un sistema basado en UNIX, así que supuse que este era el lugar correcto). Espere a que el programa salga. Si la salida no fue un accidente, ejecútelo nuevamente. De lo contrario, deje abierta la ventana del informe de bloqueo y salga.

Me gustaría que este script se ejecute para siempre hasta el bloqueo o la finalización manual.

Tengo una idea vaga pero no estoy seguro. Esto es lo que tengo hasta ahora:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi
Ben enloquecido Euden
fuente
casi definitivamente no quieres que un script se ejecute para siempre por ningún motivo. desea que un servicio , o un demonio , se ejecute para siempre. No sé cómo lo hacen en las manzanas, pero probablemente debería mirar un poco más de cerca a su sistema de inicio para averiguar si hay alguna forma de registrar un servicio con él. Por lo general, los demonios se renuevan periódicamente para actualizar / guardar el estado; en realidad, no se repiten para siempre.
mikeserv

Respuestas:

12

Esto es lo que hace Bash while loops :

while /path/to/application.app
do
    :
done

Ejecutará la aplicación y, si finaliza con éxito, ejecutará el cuerpo del bucle. :es el comando no operativo del shell (el bucle debe tener un cuerpo, así que eso es lo que ponemos allí); después de eso vuelve a la cima y ejecuta el programa nuevamente. Si falla, el bucle deja de ejecutarse y el script se cierra.

Sin embargo, parece que lo que está ejecutando podría ser una aplicación Mac normal ( .app): hay un par de problemas que surgen en ese caso. Una es que es necesario utilizar el opencomando , en lugar de correr el directorio de la aplicación directa: open /path/to/application.app.

La otra es que cuando lo haga open, generalmente terminará inmediatamente con éxito, independientemente de lo que la aplicación haga: eso no es absolutamente universal, pero la mayoría lo hará. Si el lo hace, puede utilizar la -Wopción para forzar opena bloquear hasta que los extremos de aplicación: open -W /path/to/application.app. Tenga en cuenta que si la aplicación ya se estaba ejecutando, esto esperará hasta que la ejecución existente también finalice.

La cantidad de un problema depende de la aplicación que esté ejecutando. Si no funciona bien, hacer esto desde el shell puede no ser la mejor opción. En ese caso, probablemente sea mejor usar AppleScript, que puede consultar en Ask Different .

Michael Homer
fuente
Tengo una aplicación en Mac que puede bloquearse intencionalmente con la que probé la solución anterior. reiniciará automáticamente la aplicación incluso después de fallar. ¿Hay alguna manera de verificar la salida de la aplicación? como abierto obviamente terminará con una salida de 0, por lo que se ejecutará de nuevo independientemente.
Ben Enloquecido Euden
@BenCrazedUpEuden: Entiendo que opensolo devuelve fallas para ciertos errores de inicio. Las aplicaciones son iniciadas por un servicio del sistema, no directamente, por lo que no hay canal de comunicaciones directo de regreso. A veces es posible iniciar el ejecutable de la aplicación directa: /Applications/YourProgram.app/Contents/MacOS/YourProgram. De lo contrario, saldremos de Unix y nos dirigiremos a lugares en los que obtendrá una mejor respuesta en Pregunte diferente . Puede ejecutar AppleScript desde el shell conosascript
Michael Homer
0

He probado esto:

#!/bin/bash
while <your_cmd_here>
do
    true
done

Esto funciona probando el código de retorno de su comando, estilo POSIX. 0 significa Ok, cualquier otra cosa puede ser tratada como un error.

fduff
fuente