Uso de launchd para monitorear un programa o proceso en ejecución

Escribí un script bash simple para verificar si un programa (suministrado como su único argumento) se está ejecutando y enviar un correo electrónico a una dirección establecida en el script si no es así. El script funciona si se ejecuta en la línea de comando, pero no puedo hacer que funcione bajo launchd como agente de usuario (~/Library/LaunchAgents) donde trato de configurarlo para que se ejecute cada minuto. La última encarnación del archivo .plist relevante es (supervisando Dropbox):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>greencollar.Dropbox.checkRun</string>
        <key>StartInterval</key>
        <integer>60</integer>
        <key>Program</key>
        <string>/Users/greencollar/Documents/code/proc_check.sh</string>
        <key>ProgramArguments</key>
        <array>
            <string>proc_check.sh</string>
            <string>Dropbox</string>
        </array>
    </dict>
</plist>

Sí, el script bash es ejecutable y no, no hay entradas en la consola que indiquen algún problema con el archivo .plist. He intentado hacer /bin/bash el programa, pero eso no parece hacer ninguna diferencia y leer execvp(3) parece insinuar que no lo hará. También he intentado tener todo debajo <ProgramArguments>sin suerte. ¡Cualquier ayuda sería muy apreciada ya que esto me parece bastante básico y es muy frustrante que no pueda hacer que funcione!

----------------------------- 1ra Edición ------------------- --------

Aquí están los conceptos básicos reducidos del script de shell:

#!/bin/bash
PROC=$1
if ! /usr/bin/pgrep $PROC > /dev/null
then
    /bin/echo "$PROC is not running!" | /usr/bin/mail -s "$PROC down" email@mydomain
fi

No hay mucho que salir mal allí...

¿Ha ejecutado con la ruta completa como primer argumento en ProgramArguments? También, ¿cuáles son los permisos en el script? (la manera fácil es usar LaunchControl u otros programas para editar el script)
Además, cuando dice que no se ejecuta, ¿cómo sabría si se ejecuta?
Sin omitir nada, aparte de colocar un marcador de posición adecuado para algo que sea confidencial, por ejemplo, la dirección de correo electrónico y la contraseña reales , etc., edite su pregunta para incluir el contenido del proc_check.shscript de shell. Porque sin él, no puede haber un proceso completo de solución de problemas que se realice fácilmente o tratando de replicar lo más exactamente posible, donde está el problema.
@Mark, gracias por el comentario sobre mi respuesta anterior ahora eliminada. Me hizo probar el .plisten la pregunta, que admito que no lo hice porque pensé que vi un problema con él, y se disparó (en mi sistema de todos modos). Entonces, no creo que ahí esté el problema. Creo que mi nueva respuesta puede ser acertada para saber dónde podría estar el problema. Obviamente, sin ver el contenido de la secuencia de comandos , no puedo decirlo con certeza, sin embargo, es muy probable que este sea el problema.
Probé tanto el .plistcomo el proc_check.sh, usando my $HOMEy el resto de su ruta, por supuesto, y esto funciona cuando lo llamo launchdpara mí en las pruebas con "Caculator" y say $PROC is not running. No probé el envío de correo electrónico porque mi sistema no está configurado para hacerlo. Por lo tanto, es posible que desee probar como lo hice yo para ver si eso funciona y luego, si funciona, será necesario realizar la solución de problemas sobre cómo mailpodría manejarse cuando se activa por launchd. Por cierto, estoy ejecutando OS X 10.8.5, ¿qué versión está ejecutando?
@Mark Ahora estoy ejecutando con el primer argumento de <ProgramArguments> como ruta completa. Pero se estaba disparando de todos modos sin haber hecho eso. No dije que no funcionara. Dije que no funcionó .

Respuestas (2)

Estoy publicando esto como respuesta porque es demasiado para un comentario y creo que sé cuál puede ser el problema, incluso sin ver el contenido del proc_check.sh script de shell .

Me di cuenta después de leer nuevamente su pregunta y los comentarios posteriores, después de eliminar mi primera respuesta, la pista era que el script funcionaba desde la línea de comando pero no cuando lo llamaba launchd.

.plistCuando se activa su archivo de agente de usuario , $PATHes posible que el que recibe no contenga las rutas a algunos comandos/utilidades que se llaman dentro del script . Lo $PATHque se pasa al proc_check.sh script de shell es solo:

/usr/bin:/bin:/usr/sbin:/sbin

Por lo tanto, cualquier programa que se llame en el script que no esté en el anterior $PATHo que incluya su nombre de ruta completo no se está ejecutando cuando lo llama launchd.

Para arreglar esto, use el nombre de ruta completamente calificado para todos los ejecutables llamados dentro del script , que no están en lo anterior $PATH, o agregue una PATH=...declaración después de shebang, donde ...está la salida real de, echo $PATHen la Terminal, por ejemplo:

#!/bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

Nota: Lo $PATHanterior es lo que se genera echo $PATHen mi sistema y puede ser diferente en el suyo.

Gracias por los comentarios hasta ahora. Modifiqué mi secuencia de comandos hasta lo esencial y puse las rutas completas a todos los ejecutables, pero aún no funciona. Aquí está el guión: #!/bin/bash PROC=$1 if ! /usr/bin/pgrep $PROC > /dev/null then /bin/echo "$PROC is not running!" | /usr/bin/mail -s "$PROC down" email@mydomain fidefinitivamente es el guión, ya que una edición incorrecta resultó en mensajes de consola cada minuto. Pero no puedo ver qué tiene de malo.
@GAM, agregue su secuencia de comandos a su pregunta en una estructura con el formato adecuado, no en un comentario.

Después de llegar tan lejos, tenía que haber algún problema con la invocación del correo por launchd, así que busqué eso y encontré this que hacía referencia a this . Era el archivo .plist en el sentido de que no incluía la clave AbandonProcessGroup que permitiría que el proceso de correo viviera lo suficiente como para funcionar . agregando

<key>AbandonProcessGroup</key>
<true/>

lo hizo funcionar

Me estaba preparando para esto porque estaba usando un .plist generado por una aplicación de terceros para "ahorrar tiempo". Aparentemente, tales aplicaciones no siempre son completas o precisas en los archivos .plist que producen.

Gracias a @user3439894 y @Mark por su ayuda.