Verifique si un proceso se está ejecutando, si no lo ejecuta nuevamente en la Terminal

2

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

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

Gracias.

    
pregunta depi 18.03.2011 - 13:35

3 respuestas

5

En OSX usa launchd para esto. launchd iniciará un comando en el inicio de sesión o arranque y, si el proceso finaliza, se reiniciará.

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

  <?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 en este archivo, ingrese en ~ / Library / LaunchAgents. Si cuando la máquina arranca, entonces / Library / LaunchDaemons (que no puede tener acceso a la GUI) pero se ejecutará como root a menos que agregue una clave UserName. (Gracias a @Gordon Davisson por la corrección y releer Definiciones de Apple )

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

    
respondido por el Mark 18.03.2011 - 13:48
3

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

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

    
respondido por el Aaron Lake 18.03.2011 - 13:52
2

¿Por qué necesitas sondear activamente el script? ¿Por qué no solo ponerlo en un bucle de shell 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 sin hacer su trabajo.

    
respondido por el m000 29.03.2011 - 14:36

Lea otras preguntas en las etiquetas