J'essaie actuellement de créer une unité systemd en tant que serveur Web. Actuellement, mon foo.service
fichier se présente comme suit:
[Unit]
Description=The Foo Web Server
[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo
[Install]
WantedBy=multi-user.target
L' foo
exécutable enregistre automatiquement toutes les requêtes HTTP sur stdout - ceci est bien testé. Cependant, lorsque je consulte les journaux avec journalctl -u foo
, je n'obtiens qu'une sortie comme celle-ci:
...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...
Quelqu'un pourrait-il expliquer pourquoi il n'enregistre pas toutes les sorties stdout? J'ai regardé brièvement cette question précédente , mais cela n'aide pas - mais cela fait allusion à quelque chose du genre "... peut ne pas fonctionner pour les systèmes qui n'utilisent pas full systemd" - serait-ce le cas pour Ubuntu 15.04 ? Merci d'avance, toute aide à ce sujet serait très appréciée!
print('Hello World!', flush=True)
ça et ça a fait l'affaire! La sortie a commencé à apparaître dans journalctl.Réponses:
En fait, la mise en mémoire tampon sous UNIX dépend du contexte: lorsque stdout est redirigé vers quelque chose d'interactif comme une console - il est généralement mis en mémoire tampon de ligne, sinon il est entièrement mis en mémoire tampon.
La mise en mémoire tampon peut être modifiée dans l'application à l'aide de l' appel à la bibliothèque setvbuf .
Mais cela peut aussi être fait avec la commande stdbuf au lancement:
(pour les cas tampons de ligne)
la source
ExecStart=/my/foo/program
, pourquoi le journal stdout n'est pas vidé à la fin du service, mais disparaît complètement à la place.Par défaut sur Ubuntu 15.04 , les journaux systemd ne sont volatils et conservés
/run/systemd/journal
et sont perdus à chaque redémarrage. Pour utiliser le journal systemd persistant , vous devez créer le répertoire (et redémarrer systemd-journald.service)./var/log/journal
Donc, peut-être, la
stdout
sortie est juste redirigée verssyslog
et non conservée dans le journal systemd . Pour cela, vous devrez peut-être utiliser un journal systemd persistant comme expliqué ci-dessus.Avez-vous vérifié
/var/log/syslog
votrefoo
journal?la source
/var/log/journal
comme vous l'avez mentionné, mais je ne vois pas de toute façon la sortie standard de mon service systemd. dans le/var/log/syslog
je ne le vois pas non plus.