Come posso scrivere su Notification Center da un comando launchd?

3

Ho ottenuto un plist impostato per essere eseguito a intervalli regolari e lo abbiamo inserito in / Library / LaunchDaemons in questo modo:

/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

Il problema è che non sembra essere eseguito. Ecco il 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>

L'ho caricato con sudo launchctl load -w /Library/LaunchDaemons/macports_update_notifier.plist .

Ecco cosa produce sudo launchctl list macports_update_notifier :

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

Lo script viene eseguito in circa un secondo e funziona bene quando viene eseguito da solo. Deve essere eseguito come root.

Sto usando OS X 10.8.1. Quale potrebbe essere il problema?

modifica

Il mio script esegue terminale-notifier che è uno strumento da riga di comando per visualizzare le notifiche in Mountain Lion e questo è dove il daemon balle.

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

Ho scoperto che il daemon funziona correttamente se non è caricato con sudo . Una differenza è che launchctl load test.plist segnala "LimitLoadToSessionType" = "Aqua" anziché "System" . Tuttavia se imposto LimitLoadToSessionType a Aqua nel plist e carico con sudo launchctl rifiuta di caricarlo visualizzando nothing found to load . Deve comunque essere eseguito come root perché aggiorna il database macports.

Aggiorna

Penso di aver trovato il motivo per cui una GUI non può essere lanciata da un demone; Libreria per sviluppatori Mac, demoni e agenti . Un agente può farlo. Nel mio caso, ha bisogno di comunicare con il daemon per visualizzare le informazioni ogni volta che il daemon ha aggiornato Macport. Ora la domanda è: Come faccio a chiedere all'agente e al demone di rispondere?

    
posta seron 05.09.2012 - 14:25
fonte

2 risposte

2

Puoi inviarlo al Centro di notifica usando Applescript (osascript) nello script della tua shell.

C'è un ottimo thread qui che spiega i vari modi di per esempio, eseguendo solo Applescript come script di shell o riuscendo a mescolare il applescript con bash, per esempio.

Ho creato uno script di 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\""

Ho quindi creato un LaunchDaemon nello stesso modo in cui lo hai caricato e caricato senza 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>

Ogni 90 secondi ricevo una notifica:

L'icona di notifica che noterai è quella degli editor di script. Il che significa che la notifica è controllata dalle impostazioni di notifica degli script di modifica nel Centro notifiche

    
risposta data 16.12.2014 - 12:08
fonte
0

Prova:

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

so / bin / sh /your/script.sh

testato questo e funziona:

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

contenuto:

<?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>

il test.plist e il 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

il contenuto di test.sh

sh-3.2# cat ~clt/bin/test.sh
#!/bin/sh
echo "works" >> /tmp/test.txt
    
risposta data 05.09.2012 - 15:58
fonte

Leggi altre domande sui tag