1 votos

Tratando de usar launchd para hacer que mi iMac corriendo 10.7.5 me envíe por correo electrónico su dirección IP no funciona

Es la primera vez que uso launchd así que hay muchas cosas que no sé.

Un poco de información de fondo.

Configuré todo para poder usar el comando mail para enviar correos con mi gmail. Escribí un bash script (IPSend.sh) usando ifconfig, grep, y mail. Ejecutar el script manualmente como cualquier usuario, incluyendo Root, funciona perfectamente y envía el correo electrónico a la dirección de correo electrónico especificada. Copiado el script a /usr/local/bin/ los directorios tienen permisos rwxr-xr-x y el script -rwxr-xr-x@ todo es Root:wheel. Creé un archivo plist y lo copié en /Library/LaunchDaemons (-rw-r--r--@ 1 Root wheel 918 Dic 25 16:01 com.fer.ip.plist), lo depuré con plutil -lint hasta que el resultado fue correcto.

Cuando cargo con launchctl /Library/LaunchDaemon/com.fer.ip.plist (como Root) no me da ningún error el correo no se envía y el log muestra algo como

25 dic 16:18:00 dbe4b6a01 com.apple.launchd[1] ("com.fer.ip"): Estrangulando el respawn: Se iniciará en 6 segundos
25 dic 16:18:06 dbe4b6a01 com.apple.launchd[1] ("com.fer.ip"): Acelerando el respawn: Se iniciará en 10 segundos
Dec 25 16:18:37: --- último mensaje repetido 2 veces --- Dec 25 16:18:37 dbe4b6a01 com.apple.launchd[1] ("com.fer.ip"): Estrangulando el respawn: Comenzará en 10 segundos
Dec 25 16:18:37 dbe4b6a01 com.apple.launchd[1] (0x7f9170659600.anonymous.sendmail[20303]): Fallo al añadir el kevent para el PID 20303. Se descargará a la vuelta de MIG
Dec 25 16:18:37 dbe4b6a01 com.apple.launchd[1] (0x7f9170659600.anonymous.sendmail[20303]): Descargando el PID 20303 en el retorno MIG.
25 dic 16:18:47 dbe4b6a01 com.apple.launchd[1] ("com.fer.ip"): Estrangulando el respawn: Se iniciará en 10 segundos Dec 25 16:19:00: --- último mensaje repetido 1 vez ---
25 dic 16:19:00 dbe4b6a01 com.apple.launchd[1] ("com.fer.ip"): Estrangulando el respawn: Se iniciará en 7 segundos

La razón por la que digo "algo así" es que a veces no me aparece el "Failed to add kevent for PID" o aparece antes.

Estoy totalmente perdido. Ni idea de lo que significa el "Failed to add kevent for PID" o por qué no está funcionando como un proceso launchd cuando funciona manualmente. ¡Por favor, ayuda!

Aquí está mi script cambiando mi dirección de correo electrónico:

#!/bin/sh

ifconfig | grep -o -E [0-9]+[.][0-9]+[.][0-9]+[.][0-9]+ |grep -v "127" |grep -v "255" | mail -s "iMac" myemail@isp.com.xx

y aquí está mi archivo plist:

<?xml version="1.0" encoding="UTF-8"?> <!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>"com.fer.ip"</string>

        <key>ProgramArguments</key>

        <array> 
            <string>/usr/local/bin/IPSend.sh</string>
        </array>

        <key>OnDemand</key>
        <false/>

        <key>StartInterval</key>
        <integer>60</integer>

        <key>KeepAlive</key>
                <true/>

        <key>StandardOutPath</key>
        <string>/tmp/test.stdout</string>

        <key>StandardErrorPath</key>
        <string>/tmp/test.stderr</string>

</dict>
</plist>

Tanto los archivos de error estándar como los de salida estándar están siempre vacíos

1voto

12padams Puntos 36

No sé por qué se me pasó la primera vez, pero al revisar tu problema ahora mismo, me he dado cuenta de algunas incoherencias en el archivo plist que bien podrían ser el problema. Creo que esto solucionará tu problema.

    <?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.fer.ip</string>
                            <key>Program</key>
                                <string>/usr/local/bin/IPSend.sh</string>
                            <key>RunAtLoad</key>
                                <true/>
                            <key>KeepAlive</key>
                                <false/>    
                   </dict> 
</plist>

Espero que esto ayude.

F.

0voto

12padams Puntos 36

Algunas sugerencias:

  1. En el plist, cambiar:

    OnDemand to true; KeepAlive to false
  2. Rediseñar el shell script para informar del estado a la salida estándar o fallar e informar al error estándar. Así:

    #!/bin/bash
    
    MYSTDOUT=/tmp/test.stdout
    
    MYSTDERR=/tmp/test.stderr
    
    [[ ifconfig | grep -o -E [0-9]+[.][0-9]+[.][0-9]+[.][0-9]+ | grep -v "127" | grep -v "255" | mail -s "iMac" myemail@isp.com.xx ]] && [[ echo "(X) SUCCESS: email sent" > ${MYSTDOUT} ; exit [0] ]]
    
    echo "(!) FAILURE: email not sent" 2> ${MYSTDERR} 
    
    exit [1]

Espero que esto ayude.

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