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?