[launchd-dev] Yosemite not starting a system launch agent
James Bucanek
subscriber at gloaming.com
Mon Jun 22 18:31:49 PDT 2015
Greetings,
Here's my problem in a nutshell:
I have a simple scheduler daemon that runs in the background for logged
in users. The problem is that it won't start when installed in Yosemite
(seems to start in all previous versions of OS X that use launchd).
Here's what my program does:
1) I install the com.qrecall.sheduler.plist in /Library/LaunchAgents/
(with the correct ownership and access privileges).
2) launchctl load -S Background
/Library/LaunchAgents/com.qrecall.scheduler.plist
(successful)
3) launchctl start com.qrecall.scheduler
(exits with status 1)
And the scheduler process is NOT started. All attempts to get it started
through launchctl have failed.
However, I know that it's installed because if you simply restart the
system the scheduler deamon starts running like a champ.
Now ... I know what you're going to say: "Dude! You should be using the
new launchctl commands introduced in 10.10!"
Tried that. I can't seem to get anywhere with it. Basically, I don't
know what I'm doing. I've read the man page for the new launchctl about
20 times and I'm still not sure how I should be using it.
For per-user agents, it seems pretty obvious that you would bootstrap
and address the service in the user/login/gui domain (i.e. launchctl
enable user/501/com.qrecall.scheduler).
But I don't understand how to treat a system-wide user agent that should
be installed in /Library/LaunchAgents. Through trial and error, I've
discovered that I can address the current user's instance of the
scheduler process for commands like "kill". So this command works:
launchctl kill TERM user/501/com.qrecall.scheduler
It sends a TERM signal and the daemon restarts.
However, I can't find anyway to use the bootstrap command to install it,
the enable command won't start it, and the kickstart command says
there's no such service.
It would seem to make sense that a system-wide agent would have to be
installed in the system domain, but this command:
sudo launchctl bootstrap system
/Library/LaunchAgents/com.qrecall.scheduler
results in the error "/Library/LaunchAgents/com.qrecall.scheduler.plist:
Service cannot load in requested session"
Attempts to use any other domain in the command result in a syntax
error, so I'm completely stumped as to how the service should be installed.
I've figured out the I can enable and disable the per-user instance, but
it has no effect on the running process. In other words, disabling won't
halt the service and enabling it won't start it.
And don't get me started on unbootstrap, which doesn't appear to be
implemented.
So, at this point I have my feet planted firmly in mid-air...
James Bucanek
More information about the launchd-dev
mailing list