web-dev-qa-db-fra.com

Comment activer la journalisation launchd sur OS X?

Comment activer la journalisation launchd sur OS X 10.6?

J'ai ajouté un nouveau démon qui ne démarre pas correctement (l'état est 1).

Je veux déboguer le problème mais je n'ai pas pu trouver les journaux launchd, ils ne sont pas dans /var/log/launchd.log.

38
sorin

J'ai trouvé la solution

 Sudo launchctl log level debug 

et après ça

 tail -f /var/log/system.log
27
sorin

En supposant que vous essayez de consigner votre processus plutôt que de lancer lui-même, si vous incluez les lignes suivantes dans le fichier plist launchd:

<key>StandardOutPath</key>
<string>/path/to/logfile.log</string>
<key>StandardErrorPath</key>
<string>/path/to/another_logfile.log</string>

et rechargez le processus, toute journalisation ou impression interne à votre script sera capturée dans l'un de ces deux fichiers à chaque exécution. bien que la rotation des fichiers vous incombe. comme vous pouvez vous y attendre, si vous utilisez le même fichier dans les deux cas, il enregistrera à la fois l'erreur et la sortie standard au même endroit.

Voir: Débogage de la section Jobs launchd dans Création de démons de lancement et d'agents .

25
peter

Sous OS X 10.11 (El Capitan), vous pouvez utiliser Sudo launchctl debug <service-target> --stdout --stderr pour activer la journalisation unique, si vous ne souhaitez pas prendre l'option de système de fichiers suggérée par @peter.

Beaucoup de choses sont différentes dans l'implémentation actuelle de launchctl et de <service-target> est un peu bizarre. Par exemple, supposons que j'ai un service local que je configure à ~/Library/LaunchAgents/dev.localmon.plist, qui a le "label" dev.localmon. Son <service-target> est gui/$UID/dev.localmon, où $UID est votre ID utilisateur qui, puisque vous l'exécutez au niveau de la CLI, votre Shell va interpoler pour vous.

Supposons donc mon dev.localmon le service se bloquait au démarrage (c'était le cas), je pouvais appeler ce qui suit pour que launchctl redirige stdout et stderr du processus dans mon shell la prochaine fois (et seulement la prochaine fois) que le service démarre:

Sudo launchctl debug gui/$UID/dev.localmon --stdout --stderr

Étant donné que cela se bloque avec les ATS ouverts et prêts, accédez à un autre terminal et exécutez:

launchctl start dev.localmon
# start is a legacy command and doesn't use the fancy new service-target notation

Ensuite, de retour dans le premier terminal, vous devriez voir la sortie. (Curieusement, il ne se ferme pas à la fin du processus de service, vous devrez donc Ctrl-C.)

Btw, une fois que vous avez corrigé votre fichier de configuration avec le PATH ou l'environnement qui cassait le service auparavant, vous devez toujours utiliser l'ancien launchctl unload ~/Library/LaunchAgents/dev.localmon.plist && launchctl load ~/Library/LaunchAgents/dev.localmon.plist en deux étapes depuis la prétendue sous-commande uncache de la documentation a l'effet suivant:

La commande n'est pas encore implémentée.

Yay pour la stratégie de sortie post-emploi d'Apple: "Allez vite et cassez les choses"

19
chbrown