I've got a plist
set to run at a set interval, and have put it in /Library/LaunchDaemons like so:
/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
The problem is that it doesn't seem to execute. Here's the 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>
I loaded it with sudo launchctl load -w /Library/LaunchDaemons/macports_update_notifier.plist
.
Here's what sudo launchctl list macports_update_notifier
produces:
{
"Label" = "macports_update_notifier";
"LimitLoadToSessionType" = "System";
"OnDemand" = true;
"LastExitStatus" = 0;
"TimeOut" = 30;
"ProgramArguments" = (
"/Users/seron/bin/macports/macports_notificaton.sh";
);
};
The script executes in about a second and works fine when run on its own. It needs to run as root.
I'm using OS X 10.8.1. What could be the problem?
edit:
My script runs terminal-notifier which is command line tool to display notifications in Mountain Lion and this is where the daemon bails.
#!/bin/sh
/opt/local/bin/terminal-notifier -message 'output' -group 'debug'
I found that the daemon runs fine if it's not loaded with sudo
. One difference is that launchctl load test.plist
reports "LimitLoadToSessionType" = "Aqua"
instead of "System"
. However if I set LimitLoadToSessionType
to Aqua
in the plist and load with sudo
launchctl
refuses to load it displaying nothing found to load
. It needs to run as root however because it updates the macports database.
update
I think I've found the reason why a GUI can't be launched by a daemon; Mac Developer Library, Daemons and Agents. An agent can do that. In my case, it needs to communicate with the daemon in order to display information whenever the daemon has updated macports. Now the question is, How do I make the agent ask and the daemon answer?
terminal-notifier
doesn't work if running under a user different from the one currently logged in. Does callingterminal-notifier
withsudo
in an interactive shell work ok?terminal-notifier
with the full path in your script?