Utilisation de launchd pour des tâches courtes non démon


1

Je veux créer un "élément de démarrage" dans os x. Toute la documentation récente suggère que launchd devrait être préféré aux éléments de démarrage traditionnels.

Cependant, launchd semble être axé sur le lancement de démons réels, et non sur des tâches rapides qui font leur travail et se terminent. le document de bibliothèque de développeur dit:

Important: Si votre démon s'arrête trop rapidement après son lancement, launchd peut penser qu'il est tombé en panne. Les démons qui continuent ce comportement peuvent être suspendus et ne pas être relancés lorsque de futures demandes arrivent. Pour éviter ce problème, ne vous éteignez pas au moins 10 secondes après le lancement.

Cela me donne l’impression que launchd n’est pas la solution. L'implémentation d'un sommeil de 10 secondes semble être une solution inutile.

En substance, ma question se résume à ceci: quelle est la bonne façon de lancer un programme "Hello world" au démarrage? Launchd est le mauvais outil ici?


1) Si vous programmez quelque chose, je voterais pour le transférer dans StackOverflow 2) Tout dépend de votre cas d'utilisation dans le monde réel. Discuter d'un programme Hello World n'est pas utile. 3) launchd devrait être utilisé pour les processus en arrière-plan. Dans les autres cas, utilisez des éléments de démarrage "normaux", comme expliqué ici .
slhck

Réponses:


1

À moins que vous n'ayez besoin de compatibilité avec les anciennes versions de OS X (c'est-à-dire 10.3 ou une version antérieure), j'utiliserais un LaunchDaemon. Le problème des démons qui sortent trop rapidement n’est un problème que si launchd est censé relancer le démon. Si je comprends votre cas, ce n'est pas pertinent. La raison pour laquelle j'ai utilisé un LaunchDaemon plutôt qu'un StartupItem est que le processus de démarrage attend que StartupItems soit terminé; Je n’ai pas bien testé cela, mais j’ai l’impression que même un seul StartupItem assez rapide ralentira considérablement le processus de démarrage.

Donc, j'irais avec un LaunchDaemon. Assurez-vous simplement que son .plist comprend:

<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>

Si votre programme génère des sous-processus devant continuer à s'exécuter après la fermeture du parent, vous devez également inclure:

<key>AbandonProcessGroup</key>
<true/>

... pour empêcher launchd de "nettoyer" les sous-processus restants.


Je vous remercie. La compatibilité avec 10.3 n'est pas un problème.
jjs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.