¿Cómo puedo escribir en el Centro de notificaciones desde un comando launchd?

3

Tengo un plist configurado para ejecutarse en un intervalo establecido, y lo puse en / Library / LaunchDaemons así:

/Library/LaunchDaemons $ ll macports_update_notifier.plist 
lrwxr-xr-x  1 root  wheel    55B  5 Sep 13:47 macports_update_notifier.plist@ -> /Users/seron/bin/macports/macports_update_notifier.plist

El problema es que no parece ejecutarse. Aquí está la lista:

<?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>EnvironmentVariables</key>
    <dict>
        <key>HOME</key>
        <string>/Users/seron</string>
    </dict>
    <key>Label</key>
    <string>macports_update_notifier</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/seron/bin/macports/macports_notificaton.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
</dict>
</plist>

Lo cargué con sudo launchctl load -w /Library/LaunchDaemons/macports_update_notifier.plist .

Esto es lo que sudo launchctl list macports_update_notifier produce:

{
    "Label" = "macports_update_notifier";
    "LimitLoadToSessionType" = "System";
    "OnDemand" = true;
    "LastExitStatus" = 0;
    "TimeOut" = 30;
    "ProgramArguments" = (
        "/Users/seron/bin/macports/macports_notificaton.sh";
    );
};

El script se ejecuta en aproximadamente un segundo y funciona bien cuando se ejecuta solo. Necesita ejecutarse como root.

Estoy usando OS X 10.8.1. ¿Cuál podría ser el problema?

edit:

Mi script ejecuta notificador de terminal que es una herramienta de línea de comandos para mostrar notificaciones en Mountain Lion y aquí es donde el demonio fianzas.

#!/bin/sh
/opt/local/bin/terminal-notifier -message 'output' -group 'debug'

Encontré que el daemon funciona bien si no está cargado con sudo . Una diferencia es que launchctl load test.plist informa "LimitLoadToSessionType" = "Aqua" en lugar de "System" . Sin embargo, si configuro LimitLoadToSessionType a Aqua en el plist y cargo con sudo launchctl se niega a cargarlo mostrando nothing found to load . Sin embargo, debe ejecutarse como root porque actualiza la base de datos de macports.

actualizacion

Creo que he encontrado la razón por la que un demonio no puede iniciar una GUI; Mac Developer Library, Daemons and Agents . Un agente puede hacer eso. En mi caso, necesita comunicarse con el daemon para mostrar información cada vez que el daemon haya actualizado macports. Ahora la pregunta es: ¿Cómo hago que el agente pregunte y el daemon responda?

    
pregunta seron 05.09.2012 - 14:25

2 respuestas

2

Puedes enviarlo al Centro de notificaciones usando Applescript (osascript) en tu shell shell.

Hay un muy buen hilo aquí que explica las diversas formas de ejecutando solo Applescript como script de shell o pudiendo mezclar applecript con bash, por ejemplo.

He creado un script de shell con:

#!/bin/bash
theDate='date '+DATE: %m/%d/%y TIME:%H:%M:%S''

osascript -e "display notification \"$theDate\" with title \"test 1\" subtitle \" sub 1\""

Luego creé un LaunchDaemon de la misma manera que lo hiciste y lo cargaste sin sudo.

<?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>notifTest</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/userName/Documents/notify.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>90</integer>
</dict>
</plist>

Cada 90 segundos recibo una notificación:

El icono de notificación que notará es el de los editores de scripts. Lo que significa que la Notificación está controlada por la configuración de Notificación de los editores de secuencias de comandos en el Centro de notificaciones

    
respondido por el markhunte 16.12.2014 - 12:08
0

Prueba:

<key>ProgramArguments</key>
<array>
    <string>/bin/sh</string>
    <string>/Users/seron/bin/macports/macports_notificaton.sh</string>
</array>

entonces / bin / sh /your/script.sh

probé esto y funciona:

lrwxr-xr-x   1 root  wheel    25  5 sep 15:48 macports.update.notifier.plist -> /Users/clt/bin/test.plist

contenido:

<?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>EnvironmentVariables</key>
    <dict>
        <key>HOME</key>
        <string>/Users/clt</string>
    </dict>
    <key>Label</key>
    <string>macports.update.notifier</string>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>/Users/clt/bin/test.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>30</integer>
</dict>
</plist>

el test.plist y el test.sh

-rw-r--r--  1 root  staff  555  5 sep 15:52 /Users/clt/bin/test.plist
-rwxr-xr-x  1 root  wheel   40  5 sep 15:45 /Users/clt/bin/test.sh

el contenido de test.sh

sh-3.2# cat ~clt/bin/test.sh
#!/bin/sh
echo "works" >> /tmp/test.txt
    
respondido por el jm666 05.09.2012 - 15:58

Lea otras preguntas en las etiquetas