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?
terminal-notifier
funktioniert nicht, wenn ein anderer Benutzer als der aktuell angemeldete Benutzer ausgeführt wird. Ruft anterminal-notifier
mitsudo
in einer interaktiven Shell-Arbeit ok?terminal-notifier
mit dem vollständigen Pfad in Ihrem Skript?Antworten:
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:
Ich habe dann ein LaunchDaemon auf dieselbe Weise erstellt und ohne Sudo geladen.
Alle 90 Sekunden erhalte ich eine Benachrichtigung:
Das Benachrichtigungssymbol, das Sie bemerken werden, ist das Skripteditor. Dies bedeutet, dass die Benachrichtigung von den Benachrichtigungseinstellungen der Skript-Editoren im Benachrichtigungscenter gesteuert wird
quelle
Versuchen:
so / bin / sh /your/script.sh
getestet und funktioniert:
Inhalt:
die test.plist und die test.sh
der Inhalt von test.sh
quelle
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 setzenplist
und mit sudo laden bekomme ichnothing found to load
. Das Skript muss als root ausgeführt werden, da es die macports-Datenbank aktualisiert.