1 votos

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

He escrito un simple bash script para comprobar si un programa (suministrado como único argumento) se está ejecutando y enviar un correo electrónico a una dirección establecida en el script si no lo está. El script funciona si se ejecuta en la línea de comandos, pero no puedo conseguir que funcione bajo launchd como agente de usuario (~/Library/LaunchAgents) donde intento configurarlo para que se ejecute cada minuto. La última encarnación del archivo .plist relevante es (controlando 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 bash script es ejecutable y no hay entradas en la consola que indiquen algún problema con el archivo .plist. He intentado hacer que /bin/bash sea el programa, pero eso no parece hacer ninguna diferencia y la lectura de execvp(3) parece sugerir que no lo haría. También he intentado tener todo bajo <ProgramArguments> sin ninguna suerte también. ¡Cualquier ayuda sería muy apreciada ya que esto me parece bastante básico y es muy frustrante que no pueda conseguir que funcione!

----------------------------- 1ª edición ---------------------------

Aquí están los fundamentos del shell script:

#!/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 hacer mal ahí...

0 votos

¿Has ejecutado con la ruta completa como primer argumento en ProgramArguments - también cuáles son los permisos en el script? (la forma más fácil es usar LaunchControl u otros programas para editar el script)

1 votos

Además, cuando dices que no funciona, ¿cómo puedes saber si funciona?

3 votos

Sin omitir nada, salvo poner un marcador de posición adecuado para algo que es sensible, por ejemplo, el dirección de correo electrónico y contraseña etc., edite su pregunta para incluir el contenido del proc_check.sh shell script. Porque sin él, no puede haber un proceso completo de solución de problemas que se hace fácilmente o tratando de replicar lo más exacto posible, donde el problema es.

2voto

user3439894 Puntos 5883

Pongo esto como respuesta porque es demasiado para un comentario y creo que sé cuál puede ser el problema, aún sin ver el contenido del proc_check.sh shell script .

Me he dado cuenta tras leer de nuevo tu pregunta y los comentarios posteriores, después de borrar mi primera respuesta, el sugerencia fue el script funcionaba desde la línea de comandos pero no cuando era llamado por launchd .

Cuando su Agente de Usuario .plist se activa, el $PATH que recibe puede no contener las rutas de acceso a algunos comandos/utilidades que se están llamando dentro del script . El $PATH pasado a la proc_check.sh shell script es sólo:

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

Así, cualquier programa que se llame en el script que no está en lo anterior $PATH o incluye es nombre de ruta completamente calificado no se está ejecutando cuando es llamado por launchd .

Para solucionarlo, utilice la función nombre de ruta completamente calificado para todos los ejecutables llamados dentro del script que no están en la lista anterior $PATH o añadir un PATH=... después del 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 es lo que se obtiene con echo $PATH en mi sistema y puede ser diferente en el suyo.

0 votos

Gracias por los comentarios hasta ahora. He modificado mi script hasta lo más esencial y he puesto las rutas completas de todos los ejecutables pero todavía no funciona. Aquí está el script: #!/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 Definitivamente es el script ya que una edición incorrecta dio lugar a mensajes de consola cada minuto. Pero no puedo ver lo que está mal con él.

0 votos

@GAM, Por favor, añade tu script a tu pregunta en una estructura con el formato adecuado, no en un comentario.

2voto

GAM Puntos 21

Después de llegar hasta aquí, tenía que ser algún problema con el correo que invoca launchd, así que busqué sobre eso y encontré este que hacía referencia a este . Es fue 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. Añadiendo

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

lo hizo funcionar.

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

Gracias a @user3439894 y @Mark por su ayuda.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X