Tengo un conjunto de scripts que necesitan ejecutarse en el arranque del sistema y mantenerse vivos. Tengo el plist guardado como /Library/LaunchAgents/net.vps.tunnel.plist y tiene los permisos adecuados:
-rw-r--r-- 1 root wheel 516 Nov 6 22:03 net.vps.tunnel.plist
El script se almacena en root /Library/LaunchAgents
NO el usuario ~/Library/LaunchAgents
por lo que se supone que se ejecuta en el arranque como superusuario. Si ejecuto manualmente el script a través de sudo launchctl load /Library/LaunchAgents/net.vps.tunnel.plist
funciona bien. Pero a pesar de que se supone que debe ejecutarse en el arranque, no lo hace. Cuando compruebo launchctl list
inmediatamente después del arranque, veo que no se ha cargado. Intentando arrancar a través de sudo launchctl start net.vps.tunnel
falla con el error "launchctl start error: No hay tal proceso".
Si me conecto a través de la GUI, de repente launchd carga todos los scripts. Sin embargo, se ejecutan con mis permisos de usuario y algunos de ellos no funcionan correctamente. En los plists, he especificado la clave UserName como usuario daemon, pero todos se ejecutan con mis credenciales de usuario.
Aquí está el archivo plist en cuestión, ubicado en /Library/LaunchAgents/net.vps.tunnel.plist y con permisos -rw-r--r-- para 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>
Y aquí está el túnel script, con permisos -rwxr-x--- para _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