Quelle est la façon la plus simple d'exécuter un script au démarrage sous OS X?

12

Je veux qu'un script (bash / zsh / ruby ​​/ ...) s'exécute au démarrage sous OS X. Quelle est la façon la plus simple de le faire, sans jouer avec les fichiers xml / plist, et de préférence sans avoir besoin de faire une méta AppleScript .

John Bachir
la source

Réponses:

7

MacOS X utilise Vixie cron, qui possède des balises META spéciales pour le lancement au moment du redémarrage. Voir la page de manuel pour le format de fichier.

quelque chose comme:

@reboot /path/to/script.sh

dans votre crontab fonctionnerait. Je ne suis pas sûr que ce soit une meilleure solution que launchd, vous avez probablement plus de méta-outils qui regardent launchd que cron.

Rich Homolka
la source
J'adore, vous m'avez prouvé cronle contraire :-) Bien que sur OS X, ce n'est pas génial avec la journalisation par défaut (il y avait un sujet à ce sujet il y a quelques jours à peine).
Daniel Beck
c'est parfait.
John Bachir
1
Notez que cron, at et ainsi de suite sont dans une certaine mesure déconseillés dans OS X. Je ne trouve pas de déclaration explicite à ce sujet dans les divers documents, et je ne sais pas à quel point ils sont dépréciés de manière agressive, mais launchd semble généralement préféré. Voir la documentation launchd pour une introduction.
Norman Gray
plist ne fonctionnera pas pour moi - cela fonctionne comme un charme - merci! :-D
BG Bruno
Honnêtement, je ne savais pas si la syntaxe serait la même sur OS X.
NobleUplift
6

Si vous changez d'avis:

<?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.superuser.245713</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>UserName</key>
    <string>someuser</string>
</dict>
</plist>

Stockez comme com.superuser.245713.plistdans /Library/LaunchAgents/et faites root:wheelle propriétaire / groupe.

Daniel Beck
la source
1
Il est sans doute préférable de l'installer /Library/LaunchAgentsplutôt que dans la /System/Library/LaunchDaemonsmesure où le /Systemcontenu est spécifique au système d'exploitation et celui sous /Libraryest davantage utilisé pour les produits tiers. En outre, LaunchDaemons«devrait contenir des éléments qui s'exécuteront en tant que root, généralement des processus d'arrière-plan», où LaunchAgents«s'exécuter en tant qu'utilisateur ou dans le contexte de l'espace utilisateur». La source de ces citations est un excellent article sur launchd que je consulte pour les questions de launchd.
Doug Harris
@DougHarris Merci pour les suggestions! Je dois admettre que je venais de taper ce ad-hoc - alors que je teste habituellement mes solutions, je n'étais pas prêt à redémarrer ma machine pour cela.
Daniel Beck
C'est très bien, même si j'aime mieux la solution cron de Vixie :)
John Bachir
En fait, il devrait être placé dans / Library / LaunchDaemons. Les agents s'exécutent uniquement à l'intérieur d'une session utilisateur, c'est-à-dire qu'ils ne s'exécuteront pas (ou plus précisément, ne pourront s'exécuter) que lorsque quelqu'un se connectera, s'exécutera à nouveau chaque fois que quelqu'un se connectera et s'exécutera toujours en tant qu'utilisateur actuellement connecté. Les démons s'exécutent (/ deviennent éligibles pour s'exécuter) au démarrage et, bien qu'ils s'exécutent normalement en tant que root, ils peuvent être exécutés en tant qu'autre utilisateur avec la clé UserName.
Gordon Davisson
2
@ the0ther Le Web n'oublie pas.
Daniel Beck
2

Il existe également des hooks de connexion si vous préférez que le script s'exécute (en tant que root) lorsqu'un utilisateur se connecte plutôt que lorsque la machine est démarrée.

Deditos
la source