Wie kann ich von einem Launchd-Befehl aus ins Notification Center schreiben?

3

Ich habe ein plist Legt fest, dass sie in einem festgelegten Intervall ausgeführt wird, und haben es in / Library / LaunchDaemons wie folgt abgelegt

/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

Das Problem ist, dass es nicht ausgeführt wird. Hier ist die 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>

Ich habe es mit geladen sudo launchctl load -w /Library/LaunchDaemons/macports_update_notifier.plist.

Hier ist was sudo launchctl list macports_update_notifier produziert:

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

Das Skript wird in etwa einer Sekunde ausgeführt und funktioniert gut, wenn es eigenständig ausgeführt wird. Es muss als root laufen.

Ich verwende OS X 10.8.1. Was könnte das Problem sein?

bearbeiten:

Mein Skript läuft Terminalbenachrichtigung Dies ist ein Befehlszeilentool zum Anzeigen von Benachrichtigungen in Mountain Lion. Hier setzt der Dämon an.

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

Ich habe festgestellt, dass der Daemon einwandfrei läuft, wenn er nicht geladen wird sudo. Ein Unterschied ist das launchctl load test.plist Berichte "LimitLoadToSessionType" = "Aqua" anstatt "System". Wenn ich aber setze LimitLoadToSessionType zu Aqua in der plist und laden mit sudo launchctl weigert sich, es zu laden nothing found to load. Es muss jedoch als root ausgeführt werden, da es die macports-Datenbank aktualisiert.

aktualisieren

Ich glaube, ich habe den Grund gefunden, warum eine GUI nicht von einem Dämon gestartet werden kann. Mac Developer Library, Daemons und Agenten . Ein Agent kann das tun. In meinem Fall muss er mit dem Daemon kommunizieren, um Informationen anzuzeigen, wenn der Daemon macports aktualisiert hat. Nun stellt sich die Frage: Wie kann ich den Agenten fragen lassen und der Dämon antworten?

seron
quelle
Ja, so ist es. Es hat die gleichen Flaggen / Eigentumsrechte wie der Symlink.
seron
Könnte sein terminal-notifier funktioniert nicht, wenn ein anderer Benutzer als der aktuell angemeldete Benutzer ausgeführt wird. Ruft an terminal-notifier mit sudo in einer interaktiven Shell-Arbeit ok?
nohillside
@patrix tut es
seron
Und du rufst an terminal-notifier mit dem vollständigen Pfad in Ihrem Skript?
nohillside
@patrix Ich habe das Skript meiner Frage hinzugefügt.
seron

Antworten:

2

Sie können mit Applescript (osascript) in Ihrem Shell-Skript an das Notification Center senden.

Es gibt einen sehr guten Faden Hier Dies erklärt die verschiedenen Möglichkeiten, entweder nur Applescript als Shell-Skript auszuführen oder Applescript beispielsweise mit Bash zu mischen.

Ich habe ein Shell-Skript erstellt mit:

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

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

Ich habe dann ein LaunchDaemon auf dieselbe Weise erstellt und ohne Sudo geladen.

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

Alle 90 Sekunden erhalte ich eine Benachrichtigung:

enter image description here

Das Benachrichtigungssymbol, das Sie bemerken werden, ist das Skripteditor. Dies bedeutet, dass die Benachrichtigung von den Benachrichtigungseinstellungen der Skript-Editoren im Benachrichtigungscenter gesteuert wird

markhunte
quelle
@seron hast du das probiert?
markhunte
0

Versuchen:

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

so / bin / sh /your/script.sh

getestet und funktioniert:

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

Inhalt:

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

die test.plist und die 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

der Inhalt von test.sh

sh-3.2# cat ~clt/bin/test.sh
#!/bin/sh
echo "works" >> /tmp/test.txt
jm666
quelle
Hier passiert nichts. Auch keine Ausgabe in die Datei system.log.
seron
Seltsam, weil das oben auf ML funktioniert (zumindest auf meinem Notebook). Versuchen genau kopiere alles auf dein System, ändere nur "/ Users / clt" in dein ...
jm666
Vielleicht liegt das Problem in der Namensgebung ... Ich habe Ihre Underscore_named.plist in übliche dot.named.plist geändert.
jm666
Ich habe einen Test gemacht, der Ihnen gefällt und es funktioniert. Jetzt muss ich herausfinden, warum meine nicht sind.
seron
Mein Skript führt den Terminal-Notifier aus Verknüpfung Dies führt dazu, dass das Skript fehlschlägt und der Daemon danach nicht mehr funktioniert. Ich habe experimentiert, indem ich es als Benutzer ohne Sudo lade, d. H. launchctl load test.plist und in diesem Fall funktioniert alles gut. launchctl list test Berichte "LimitLoadToSessionType" = "Aqua" Wenn es mit Sudo geladen ist, ist es auf gesetzt "System". Wenn ich versuche es im Aqua auf Aqua zu setzen plist und mit sudo laden bekomme ich nothing found to load. Das Skript muss als root ausgeführt werden, da es die macports-Datenbank aktualisiert.
seron