Anzeigen von stdout / stderr des systemd-Dienstes

175

Ich habe eine einfache systemd-Servicedatei für eine benutzerdefinierte Anwendung erstellt. Die Anwendung funktioniert gut, wenn ich sie manuell ausführe, aber meine CPU wird voll, wenn ich sie mit systemd ausführe.

Ich versuche herauszufinden, wo mein Problem liegt, aber ich weiß nicht, wo ich die Ausgabe finden soll (oder wie ich systemd so konfiguriere, dass die Ausgabe irgendwo abgelegt wird).

Hier ist meine Servicedatei:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

Während der gesamten Anwendung habe ich auf stdout und stderr ausgegeben.

Wie kann ich die Ausgabe meines Daemons lesen?

Bearbeiten:

Ich fand man systemd.exec, die StandardOutput=Option erwähnt, aber ich bin nicht sicher, wie man es verwendet. Von der Manpage :

StandardOutput=

Steuert, mit welchem ​​Dateideskriptor 1 (STDOUT) der ausgeführten Prozesse verbunden ist. Übernimmt eine der folgenden Optionen : Erben , Null , Tty , Syslog , kmsg , kmsg + Konsole , Syslog + Konsole oder Socket .

Wenn diese Option aktiviert ist, wird der Dateideskriptor der Standardeingabe für die Standardausgabe dupliziert. Wenn auf null gesetzt, wird die Standardausgabe mit verbunden /dev/null, dh alles, was darauf geschrieben wurde, geht verloren. Bei Einstellung auf tty wird der Standardausgang mit einem tty verbunden (wie über konfiguriert TTYPath=, siehe unten). Wenn das TTY nur für die Ausgabe verwendet wird, wird der ausgeführte Prozess nicht zum steuernden Prozess des Terminals und es wird nicht fehlgeschlagen oder darauf gewartet, dass andere Prozesse das Terminal freigeben. syslog verbindet die Standardausgabe mit dem Systemlogger syslog (3). kmsg verbindet es mit dem Kernel-Log-Buffer, auf den über dmesg (1) zugegriffen werden kann. syslog + console und kmsg + consolefunktionieren ähnlich, aber kopieren Sie die Ausgabe auch in die Systemkonsole. Socket verbindet die Standardausgabe mit einem Socket der Socket-Aktivierung, die Semantik ähnelt der jeweiligen Option von StandardInput=. Diese Einstellung wird standardmäßig übernommen.

Bedeutet das, dass dies meine einzigen Optionen sind? Ich würde zum Beispiel gerne /dev/shmetwas ausgeben oder so. Ich nehme an, ich könnte einen Unix-Domain-Socket verwenden und einen einfachen Listener schreiben, aber das scheint ein wenig unnötig zu sein.

Ich brauche dies nur zum Debuggen, und am Ende entferne ich wahrscheinlich die meisten Protokolle und ändere die Ausgabe in syslog.

Beatgammit
quelle
Haben Sie versucht, die /var/log/syslogAusgabe zu überprüfen ? Die meisten Systeme loggen sich ein, also prüfe /var/log/ich zuerst dort. Mit können Sie grepnach Text suchen, wenn Sie die Ausgabe kennen: Sollte grep "my output" /var/logden Trick machen.
sbtkd85
@ sbtkd85 - Naja, das habe ich nicht /var/log/syslog, aber /var/log/messagesmacht den Trick. Das Problem ist, laut den Protokollen, dass mein Daemon beim Start abstürzt, aber ich kann feststellen, dass er noch läuft, weil er einen HTTP-Server hat, und ich kann ihn abfragen. Es scheint, dass der Rest der Protokolle verloren geht ...
beatgammit
Warum versuchen StandardOutput=ttySie es nicht mit einer Einstellung , mit der Sie sehen können, was passiert, wenn Sie Ihren Daemon starten. Es sollte das Terminal ausgeben (möglicherweise müssen Sie ttyS0oder ähnliches verwenden, um die Ausgabe auf Ihrem Bildschirm zu erhalten).
sbtkd85
3
Sollten in diesem Zusammenhang keine Standard-E / A-Umleitungsoperatoren funktionieren? So etwas wieExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal
Was missbraucht eigentlich Ihre CPU? Handelt es sich um systemd, Ihren Dienst oder Ihr System (z. B. indem neue Kopien des Dienstes erstellt wurden, weil systemd verrückt geworden ist)?
Peterph

Antworten:

183

Aktualisieren

Wie mikemaccana feststellt, ist das systemd-Journal heute das Standardprotokollierungsgerät für die meisten Distributionen. Verwenden Sie den Befehl, um das stdoutund stderreiner Systemeinheit anzuzeigen journalctl.

sudo journalctl -u [unit]

Ursprüngliche Antwort

Standardmäßig stdoutund stderrvon einer Systemeinheit werden an Syslog gesendet.

Wenn Sie das vollständige System verwenden, ist dies über erreichbar journalctl. Auf Fedora sollte es so sein, /var/log/messagesaber Syslog wird es dort ablegen, wo es Ihre Regeln vorgeben.

Aufgrund der Zeitpunkt der Post, und die meisten Menschen davon aus, dass über Filzhut sind ausgesetzt sind systemd, wurden Sie wahrscheinlich hier beschrieben durch den Fehler betroffen: https://bugzilla.redhat.com/show_bug.cgi?id=754938 Es hat eine gute Erklärung, wie das alles auch funktioniert = selinux-policy-3.10.0-58.fc16)

Matt
quelle
5
Beachten Sie, dass bei Verwendung des Standardprotokollierungsmechanismus wie diesem standardmäßig keine persistenten Protokolle erstellt werden. Dazu müssen Sie / var / log / journal erstellen und dannsudo systemctl restart systemd-journald
mlissner
1
Welche Syslog-Einrichtung und Priorität?
Jrwren
2
Das hat bei mir geklappt : StandardOutput=syslog+consoleund StandardError=syslog+consoledanach sind alle Ausgaben von meinem Gerät in journalctl erschienen. Die Standardeinstellung war anscheinend falsch. (Wie zum Beispiel DefaultStandardOutput in /etc/systemd/system.conf)
gregn3
2
-fwar hilfreich für mich. Befolgte das Protokoll, wenn Änderungen
eintraten
2
Das macht mich wahnsinnig ... Auf einem Standard-Debian-Stretch-Journal zeigt mir CTL überhaupt keine Standardausgabe. Ich benutze sogar /usr/bin/stdbuf -oL <cmd>einen expliziten StandardOutput=journal. Immer noch nichts.
18.
81

Kürzere, einfachere, nicht vorhandene Antwort:

sudo journalctl -u [unitfile]

Wobei [unitfile] der Systemname ist .service. ZB, um Nachrichten von zu sehen myapp.service,

sudo journalctl --unit=myapp

So verfolgen Sie Protokolle in Echtzeit:

sudo journalctl -f -u myapp
Mikemaccana
quelle
4
Beachten Sie, dass dies möglicherweise erforderlich ist, sudowenn eine No journal files foundFehlermeldung angezeigt wird.
BigJosh
5
Syslog ist kein Vermächtnis ...
Miles Rout
2
Es ist in aktuellen Linux-Distributionen. Sie mögen vielleicht Syslog wirklich, aber das ändert nichts an dem, womit sie geliefert werden.
Mikemaccana
1
Sicher. Und es verwendet auch Syslog. Mein Punkt war nicht, dass systemd nicht verwendet wird, aber dass Syslog kein Vermächtnis ist.
Labyrinth
6
@JECompton Wenn die gesamte Protokollierung auf aktuellen Linux-Distributionen Journald verwendet und Syslog nicht erforderlich ist und nur aus Kompatibilitätsgründen verwendet wird, folgt logischerweise, dass Syslog Legacy ist.
Mikemaccana