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.
/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 Sie ttyS0
oder ähnliches verwenden, um die Ausgabe auf Ihrem Bildschirm zu erhalten).
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/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.