Verifique si un proceso se está ejecutando, si no, ejecútelo nuevamente en la Terminal

¿Hay alguna manera de verificar periódicamente si un proceso se está ejecutando (probablemente con un script de Apple o algún otro script de Shell) y, de no ser así, ejecutarlo en la Terminal?

Tengo un script PHP que debe ejecutarse, pero después de un tiempo se rompe, por lo que necesito iniciarlo nuevamente.

Gracias.

Respuestas (3)

En OSX, use launchd to to this. launchd iniciará un comando al iniciar sesión o arrancar y, si el proceso muere, lo reiniciará.

El proceso está controlado por un archivo .plist formateado como se define en los documentos de Apple. El ejemplo en esa página del manual es para el caso que solicite.

  <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
   http://www.apple.com/DTDs/PropertyList-1.0.dtd >
   <plist version="1.0">
   <dict>
        <key>Label</key>
        <string>com.example.exampled</string>
        <key>ProgramArguments</key>
        <array>
             <string>exampled</string>
        </array>
        <key>KeepAlive</key>
        <true/>
   </dict>
   </plist>

Si desea comenzar cuando un usuario inicia sesión, este archivo se encuentra en ~/Library/LaunchAgents. Si cuando la máquina se inicia, /Library/LaunchDaemons (que no puede tener acceso a la GUI), se ejecutará como root a menos que agregue una clave de nombre de usuario. (Gracias a @Gordon Davisson por la corrección y una relectura de las definiciones de Apple )

Para facilitar la configuración de .plist, puede usar Lingon.app disponible en Mac AppStore

Corrección: para ejecutarlo en el arranque, coloque el archivo en /Library/LaunchDaemons.
@jherran ve meta y muchos en el desbordamiento de la pila meta: no use el formato de código en texto sin formato solo para el código

Si quisiera hacer esto a través de un script de shell, haría algo como esto:

#!/bin/sh
PROCESS=`ps A | grep PROCESS_NAME | grep -v grep`
if [ "$?" -ne "0" ]; then
        echo "not running"
        ### COMMAND TO EXECUTE HERE ###
        exit 1
fi

Podría llamar a eso a través de cron cada minuto más o menos.

¿Por qué necesita sondear activamente el script? ¿Por qué no simplemente ponerlo en un bucle de script de shell y reiniciarlo cuando falla?

#!/bin/sh

let c=1
while ! php -f myscript.php; do
    echo "The script has crashed $c times so far..."
    let "c=c+1"
done

En el caso de que no falle correctamente, el sondeo de un proceso en ejecución tampoco lo salvará. También puede seguir funcionando mientras no hace su trabajo.