J'ai un ensemble de scripts qui doivent s'exécuter au démarrage du système et rester en vie. J'ai enregistré la plist sous /Library/LaunchAgents/net.vps.tunnel.plist et elle a les bonnes permissions :
-rw-r--r-- 1 root wheel 516 Nov 6 22:03 net.vps.tunnel.plist
Le script est stocké dans le fichier Root /Library/LaunchAgents
, PAS l'utilisateur ~/Library/LaunchAgents
il est donc censé s'exécuter au démarrage en tant que superutilisateur. Si je lance manuellement le script via sudo launchctl load /Library/LaunchAgents/net.vps.tunnel.plist
il fonctionne bien. Mais bien qu'il soit censé s'exécuter au démarrage, ce n'est pas le cas. Lorsque je vérifie launchctl list
immédiatement après le démarrage, je vois qu'il n'a pas été chargé. En essayant de démarrer via sudo launchctl start net.vps.tunnel
échoue avec l'erreur "launchctl start error : No such process".
Si je me connecte via l'interface graphique, launchd charge soudainement tous les scripts. Cependant, ils s'exécutent avec mes permissions d'utilisateur et certains d'entre eux ne fonctionnent pas correctement. Dans les listes de contrôle, j'ai spécifié la clé UserName en tant qu'utilisateur de démon, mais ils s'exécutent tous avec mes informations d'identification d'utilisateur.
Voici le fichier plist en question, situé dans /Library/LaunchAgents/net.vps.tunnel.plist et avec les permissions -rw-r--r-- pour 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>
Et voici le tunnel script, avec les permissions -rwxr-x--- pour _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