I have a set of scripts that need to run on system boot and stay alive. I have the plist saved as /Library/LaunchAgents/net.vps.tunnel.plist and it has the proper permissions:
-rw-r--r-- 1 root wheel 516 Nov 6 22:03 net.vps.tunnel.plist
The script is stored in the root
/Library/LaunchAgents, NOT the user
~/Library/LaunchAgents directory, so it's supposed to run on boot as the superuser. If I manually run the script via
sudo launchctl load /Library/LaunchAgents/net.vps.tunnel.plist it runs fine. But despite the fact that it is supposed to run on boot, it doesn't. When I check
launchctl list immediately after boot, I see that it has not been loaded. Trying to start via
sudo launchctl start net.vps.tunnel fails with the error "launchctl start error: No such process".
If I log in via the GUI, suddenly launchd loads all of the scripts. However, they run with my user permissions and some of them do not work properly. In the plists, I have specified the UserName key as a daemon user, but they all run under my user credentials.
Here's the plist file in question, located at /Library/LaunchAgents/net.vps.tunnel.plist and with -rw-r--r-- permissions for root:wheel:
<?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>net.vps.tunnel</string> <key>ProgramArguments</key> <array> <string>/Users/_tunnel/tunnel.sh</string> </array> <key>RunAtLoad</key> <true/> <key>WorkingDirectory</key> <string>/Users/_tunnel</string> <key>UserName</key> <string>_tunnel</string> <key>KeepAlive</key> <true/> </dict> </plist>
And here's the tunnel script, with permissions -rwxr-x--- for _tunnel:_tunnel:
#/bin/bash logger "Opening VPS tunnel..." ssh -i ./.ssh/id_rsa -gnN tunnel@********.com & PID=$! logger "VPS tunnel is now open." wait $PID logger "VPS tunnel is now closed." exit 0