web-dev-qa-db-fra.com

Systemd sur 15.04 ne se connectera pas stdout de l'unité

J'essaie actuellement de créer une unité systemd en tant que serveur Web. Actuellement, mon fichier foo.service 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'exécutable foo enregistre automatiquement toutes les demandes HTTP sur stdout - ceci est bien testé. Cependant, lorsque je consulte les journaux avec journalctl -u foo, je n’obtiens que la sortie suivante:

...
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 brièvement regardé cette question précédente , mais cela n'aide en rien - toutefois, il est question de quelque chose comme "... 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 serait grandement appréciée!

11
Athan Clark

En fait, la mise en mémoire tampon dans UNIX dépend du contexte: lorsque stdout est redirigé vers quelque chose d'interactif, par exemple une console, il est généralement protégé par une 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 setvbuf appel de bibliothèque.

Mais cela peut aussi être fait avec la commande stdbuf au lancement:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(pour le cas de tampon de ligne)

8
Velkan

Par défaut sur Ubuntu 15.04 , systemd les journaux sont uniquement volatils et conservés dans /run/systemd/journal et sont perdus à chaque redémarrage. Pour utiliser le journal persistant systemd , vous devez créer le répertoire /var/log/journal (et redémarrer systemd-journald.service).

Donc, peut-être, la sortie de stdout est simplement redirigée vers syslog et n'est pas conservée dans systemd journal. Pour cela, vous devrez peut-être utiliser un journal persistant systemd comme expliqué ci-dessus.

Avez-vous vérifié /var/log/syslog pour votre journal foo?

0
solsTiCe