Tengo un conjunto de scripts que deben ejecutarse durante el inicio del sistema y mantenerse activos. 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 la raíz /Library/LaunchAgents
, NO en el directorio del 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
, se ejecuta bien. Pero a pesar del hecho de que se supone que se ejecuta en el arranque, no lo hace. Cuando verifico launchctl list
inmediatamente después del inicio, veo que no se ha cargado. El intento de iniciar a través de sudo launchctl start net.vps.tunnel
falla con el error "launchctl start error: No hay tal proceso".
Si inicio sesión 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 las listas, he especificado la clave UserName como usuario daemon, pero todas se ejecutan bajo mis credenciales de usuario.
Aquí está el archivo plist en cuestión, ubicado en /Library/LaunchAgents/net.vps.tunnel.plist y con los 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á la secuencia de comandos del túnel, 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