4 votos

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

Tengo un plist para que se ejecute en un intervalo determinado, y lo he puesto 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 parece que no se ejecuta. Aquí está el 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>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. Es necesario que se ejecute como Root.

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

editar:

Mi script se ejecuta terminal-notificador que es la herramienta de línea de comandos para mostrar las notificaciones en Mountain Lion y aquí es donde el demonio se escapa.

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

He descubierto que el demonio funciona bien si no se carga con sudo . Una diferencia es que launchctl load test.plist informa "LimitLoadToSessionType" = "Aqua" en lugar de "System" . Sin embargo, si establezco LimitLoadToSessionType a Aqua en el plist y cargar con sudo launchctl se niega a cargarlo mostrando nothing found to load . Sin embargo, necesita ejecutarse como Root porque actualiza la base de datos de macports.

actualización

Creo que he encontrado la razón por la que una GUI no puede ser lanzada por un demonio; Biblioteca para desarrolladores de Mac, demonios y agentes . Un agente puede hacerlo. En mi caso, necesita comunicarse con el demonio para mostrar información cada vez que el demonio haya actualizado los macports. Ahora la pregunta es, ¿Cómo hago para que el agente pregunte y el demonio responda?

3voto

Malik hassan Puntos 16

Puedes enviar al Centro de Notificación usando Applescript (osascript )en tu shell script.

Hay un hilo muy bueno aquí que explica las distintas formas de ejecutar sólo Applescript como un shell script o poder mezclar applescript con bash, por ejemplo.

He creado un shell script 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 tú y lo cargué 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:

enter image description here

El icono de notificación que notarás es el de script Editores. Lo que significa que la notificación está controlada por la configuración de Editores en el Centro de notificaciones.

0voto

jm666 Puntos 4489

Inténtalo:

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

así /bin/sh /su/script.sh

probado 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

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