Usando launchd para monitorear un programa o proceso en ejecución

1

He escrito 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 lo está. La secuencia de comandos funciona si se ejecuta en la línea de comandos, pero por mi vida 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 (monitorear 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í: la secuencia de comandos bash es ejecutable y no hay entradas en la Consola que indiquen problemas 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ía. También he intentado tener todo bajo <ProgramArguments> sin suerte también. Cualquier ayuda sería muy apreciada ya que esto me parece bastante básico y es muy frustrante no poder hacerlo funcionar.

----------------------------- 1st Edit ---------------- -----------

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 para ir mal allí ...

    
pregunta GAM 07.05.2016 - 15:50

2 respuestas

2

Después de llegar tan lejos, tenía que haber algún problema con el correo que lanzaba launchd, así que busqué y encontré this que hizo referencia a esto . era el archivo .plist en el sentido de que no incluía la clave AbandonProcessGroup que permitiría que el proceso de correo perdurara el tiempo suficiente para que funcionara. Añadiendo

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

lo hizo funcionar.

Me estaba preparando para esto porque estaba usando una lista generada por una aplicación de terceros para "ahorrar tiempo". Dichas aplicaciones no siempre son completas o precisas en los archivos .plist que producen, al parecer.

Gracias a @ user3439894 & @Mark por su ayuda.

    
respondido por el GAM 09.05.2016 - 07:00
2

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

Me di cuenta después de leer nuevamente tu pregunta y los comentarios subsiguientes, después de eliminar mi primera respuesta, la pista era la secuencia de comandos que se ejecutaba desde la línea de comandos, pero no cuando la llamaba launchd .

Cuando se activa el archivo de User Agent .plist , el $PATH que recibe puede que no contenga las rutas a algunos comandos / utilidades que se llaman dentro del script . El $PATH pasado al proc_check.sh shell script es solo:

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

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

Para solucionar este problema, use el nombre de ruta completo para todos los ejecutables llamados dentro del script , que no están en el $PATH anterior, o agregue un PATH=... de declaración después de shebang , donde ... es la salida real de, echo $PATH en la Terminal, por ejemplo:

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

Nota: el $PATH de arriba es lo que genera echo $PATH en mi sistema y puede ser diferente en el tuyo.

    
respondido por el user3439894 07.05.2016 - 21:53

Lea otras preguntas en las etiquetas