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 konfiguriertTTYPath=
, 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 vonStandardInput=
. Diese Einstellung wird standardmäßig übernommen.
Bedeutet das, dass dies meine einzigen Optionen sind? Ich würde zum Beispiel gerne /dev/shm
etwas 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.
quelle
/var/log/syslog
Ausgabe zu überprüfen ? Die meisten Systeme loggen sich ein, also prüfe/var/log/
ich zuerst dort. Mit können Siegrep
nach Text suchen, wenn Sie die Ausgabe kennen: Solltegrep "my output" /var/log
den Trick machen./var/log/syslog
, aber/var/log/messages
macht 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 ...StandardOutput=tty
Sie 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 SiettyS0
oder ähnliches verwenden, um die Ausgabe auf Ihrem Bildschirm zu erhalten).ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Antworten:
Aktualisieren
Wie mikemaccana feststellt, ist das systemd-Journal heute das Standardprotokollierungsgerät für die meisten Distributionen. Verwenden Sie den Befehl, um das
stdout
undstderr
einer Systemeinheit anzuzeigenjournalctl
.Ursprüngliche Antwort
Standardmäßig
stdout
undstderr
von 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/messages
aber 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
)quelle
sudo systemctl restart systemd-journald
StandardOutput=syslog+console
undStandardError=syslog+console
danach sind alle Ausgaben von meinem Gerät in journalctl erschienen. Die Standardeinstellung war anscheinend falsch. (Wie zum Beispiel DefaultStandardOutput in /etc/systemd/system.conf)-f
war hilfreich für mich. Befolgte das Protokoll, wenn Änderungen/usr/bin/stdbuf -oL <cmd>
einen explizitenStandardOutput=journal
. Immer noch nichts.Kürzere, einfachere, nicht vorhandene Antwort:
Wobei [unitfile] der Systemname ist
.service
. ZB, um Nachrichten von zu sehenmyapp.service
,So verfolgen Sie Protokolle in Echtzeit:
quelle
sudo
wenn eineNo journal files found
Fehlermeldung angezeigt wird.