tl; dr: utiliser le lanceur de processus natif de Mac OS X et directeur, launchd
.
Pour ce faire, créez un launchctl
démon. Vous aurez un contrôle total sur tous les aspects du script. Vous pouvez exécuter une fois ou rester en vie en tant que démon. Dans la plupart des cas, c'est la voie à suivre.
- Créez un
.plist
fichier selon les instructions des documents Apple Dev ici ou plus en détail ci-dessous.
- Placer dans
~/Library/LaunchAgents
- Connectez-vous (ou exécutez manuellement via
launchctl load [filename.plist]
)
Pour en savoir plus launchd
, l'article de wikipedia est assez bon et décrit le système et ses avantages par rapport à d'autres systèmes plus anciens.
Voici le fichier plist spécifique pour exécuter un script lors de la connexion .
Mis à jour 2017/09/25 pour OSX El Capitan et plus récent (crédit à José Messias Jr ):
<?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>com.user.loginscript</string>
<key>ProgramArguments</key>
<array><string>/path/to/executable/script.sh</string></array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Remplacez la <string>
clé de programme par la commande souhaitée (notez que tout script référencé par cette commande doit être exécutable: chmod a+x /path/to/executable/script.sh
pour garantir qu'il s'adresse à tous les utilisateurs).
Enregistrer sous ~/Library/LaunchAgents/com.user.loginscript.plist
Exécuter launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist
et se déconnecter / se connecter pour tester (ou pour tester directement, exécuter launchctl start com.user.loginscript
)
Queue /var/log/system.log
pour les messages d'erreur.
La clé est qu'il s'agit d'une entrée launchd spécifique à l'utilisateur, elle sera donc exécutée lors de la connexion pour l'utilisateur donné. Les démons de lancement spécifiques au système (placés dans /Library/LaunchDaemons
) sont exécutés au démarrage.
Si vous souhaitez qu'un script s'exécute à la connexion pour tous les utilisateurs, je pense que LoginHook est votre seule option, et c'est probablement la raison pour laquelle il existe.