The immediate problem is that your .plist file isn't correctly formatted -- the contents of <string>...</string>
should be encoded with HTML entities, i.e. &
needs to be encoded as &
(note: you can check the format of .plist files with plutil -lint filename.plist
). But there are some other changes that need to be made...
Starting programs with launchd is rather different than starting them from a shell. The biggest difference is that from the shell, you want the program to go into the background and run independently of the shell, so you wrap it in nohup ... &
. With launchd, it's actually best for the program to stay in the "foreground" so launchd can keep an eye on it.
Also, the elements of ProgramArguments won't get parsed by a shell, so listing the command and its arguments with spaces between them doesn't work -- make each argument a separate element of the array.
Here's my stab at a synergy .plist. I haven't tested this, so it may need a little tweaking to work properly (see notes below):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.synergy</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/synergys</string>
<string>-f</string>
<string>--config</string>
<string>/Users/USER/bin/conf/synergy.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>Nice</key>
<integer>10</integer>
<key>KeepAlive</key>
<false/>
<key>AbandonProcessGroup</key>
<true/>
</dict>
</plist>
The last two keys above deal with how launchd should react if/when the synergys program exits. By default, it kills any surviving subprocesses and launches a new instance; these two keys supress both parts, which may or may not be what you want. Also, one thing this doesn't do that your version with nohup
does is redirect stdin and stdout to nohup.out (in case the terminal goes away); instead IIRC launchd logs things that get sent to them. If synergys is in the habbit of sending output, you might want to add something like this to the .plist:
<key>StandardOutPath</key>
<string>/dev/null</string>
<key>StandardErrorPath</key>
<string>/dev/null</string>
Also, as mankoff said, you should put this in ~/Library/LaunchAgents so it'll be autoloaded every time you log in. Oh, and you should probably add a local.
prefix to the filename (as I did with the label) to conform to the reverse-DNS naming convention.
There is no way to bypass or decrease the time limit.
Apple's documentation regarding Creating Launchd Jobs states the following:
Important If your daemon shuts down too quickly after being launched, launchd may think it has crashed. Daemons that continue this
behavior may be suspended and not launched again when future requests
arrive. To avoid this behavior, do not shut down for at least 10
seconds after launch.
Your program or script needs to keep running for at least 10 seconds. Consider implementing a loop to check for file modification dates in the last ten seconds, sleeping for ten seconds, and repeating.
Alternatively, you can watch specific files using the kqueue or FSEvents APIs. This StackOverflow question may be helpful, File-level filesystem change notification in Mac OS X.
Best Answer
Change the plist to
What it does, is to run a shell script that does the 5 second timer and calls osascript. The launchd plist just ensures the script is restarted if it were to die for some reason. Please note that I still haven't tested this, but I don't see any reason why it shouldn't work. Though I have had problems in the past when changing launchd items, which I fixed by changing the label. Which reminds me, you had omitted the value for the
Label
key in your plist.(Edit: Explain a little, and provide a complete file instead of explaining what parts need to be changed.)