2017-04-25 1 views
0

J'ai mis en place un service sur Raspbian (Jessie) en utilisant systemd pour le faire démarrer après le démarrage. La configuration du démon ressemble à ceci:Comment rediriger correctement stdout/stderr à partir d'un service systemd sur Raspbian?

[Unit] 
After=multi-user.target 

[Service] 
Type=idle 
User=root 
ExecStart=/bin/sh -c "exec /home/pi/sources/mydaemon.py >> /home/pi/mydaemon.log 2>&1" 

[Install] 
WantedBy=multi-user.target 

Cette redirection >> ne fonctionne pas. J'ai essayé la plupart des options disponibles pour StandardOutput et StandardError mais ils ne finissent jamais d'imprimer la sortie de mon script vers /var/log/daemon.log et journalctl -u mydaemon.service affiche uniquement les messages sur le service démarré et arrêté.

Je ne fais rien de drôle avec les descripteurs de fichiers du script actuellement. Je veux juste que mes déclarations print() ou logging.info() apparaissent quelque part je peux les lire. Des idées?

(Pour être clair, le démon ne doit exécuter en tant que root. Cela pourrait-il avoir quelque chose à voir avec mon problème d'impression?)

Répondre

2

Normalement, vous exécutez juste un service directement (assurez-vous qu'il est exécutable a un tralala ligne):

ExecStart=/home/pi/sources/mydaemon.py 

Et utiliser la redirection par défaut de StandardOutput= au journal systemd, de sorte que vous pouvez lire les journaux avec journalctl -u mydaemon.service. Systemd contrôle bien la croissance du fichier et la rotation des fichiers du journal pour vous.

Il est non lié que votre service s'exécute en tant que root.

Si vous ne voyez pas la sortie du journal avec ce qui précède, vérifiez également tout le journal pour les journaux proches qui pourraient être attribués à votre service:

journalctl 

Cela est nécessaire parce qu'il ya un problème connu lorsque certains Les dernières lignes de journalisation juste avant l'existence d'un script peuvent ne pas être attribuées au script. Cela serait particulièrement visible pour un script qui s'exécute juste une fraction de seconde avant de quitter.

+0

Cela semble fonctionner seulement une partie du temps. Je ne sais pas ce qui ne va pas avec systemd ou journalctl sur Raspbian Jessie, mais je pense qu'il y a un problème qui interfère avec la journalisation. Mon script tweete, donc je sais quand il est activé, mais les instructions d'impression dans le script n'apparaissent généralement pas dans le journal. – Eric

+0

En conjonction avec votre réponse, je vais essayer cette méthode à partir de mon script pour voir si j'ai plus de chance (envoyer explicitement des messages au journal) http://stackoverflow.com/questions/34588421/how-to- log-to-journald-systemd-via-python – Eric

3

J'avais besoin de lancer python avec le paramètre -u pour m'assurer que les messages n'étaient pas mis en mémoire tampon.

Avec cette ligne, les lignes d'impression est ajouté au journal immédiatement:

ExecStart=/home/pengman/scripts/mqtt_monitor/venv/bin/python -u home/pengman/scripts/mqtt_monitor/src/mqtt_monitor.py 

(je suis en cours d'exécution dans un virtualenv, mais cela ne devrait pas d'importance)