Ich habe einen Dienst (von mir selbst geschrieben), der auf einem Debian-Server (Jessie) ausgeführt wird, und die eigenen Protokolle des Dienstes weisen darauf hin, dass er zu einem bestimmten Zeitpunkt neu gestartet wurde. Es gibt keinen Hinweis auf einen Segfault oder einen anderen Absturz. Daher versuche ich jetzt herauszufinden, ob die Anwendung im Stillen fehlgeschlagen ist und von systemd erneut gestartet wurde oder ob ein Benutzer den Dienst absichtlich über neu gestartet hat systemctl
.
Der Shell-Verlauf zeigt keine solche Aktivität an, aber das ist nicht schlüssig, da export HISTCONTROL=ignoreboth
und weil eine SSH-Sitzung möglicherweise gerade abgelaufen ist und verhindert wird, dass der Bash-Verlauf eines vorherigen Logins auf die Festplatte geschrieben wird. Der Server wurde zu diesem Zeitpunkt nicht neu gestartet.
Ich würde jedoch erwarten, dass systemd selbst ein Protokoll führt, das angibt, wann ein Dienst absichtlich neu gestartet wurde. Zu meiner Überraschung konnte ich keine Dokumentation (z. B. für journalctl
) finden, wie man solche Protokolle erhält.
Einige andere Beiträge (z. B. Wo ist / warum gibt es kein Protokoll für normale Benutzer-Systemdienste? ) Scheinen darauf hinzuweisen, dass Protokollnachrichten wie diese vorhanden sein sollten:
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.
Auf meinem System werden solche Protokollmeldungen jedoch nicht angezeigt.
Gibt es eine Möglichkeit herauszufinden, wann systemd-Dienste gestartet, gestoppt oder neu gestartet wurden?
Bearbeiten : Es scheint, dass das typische Problem darin besteht, dass journalctl
Benutzer als nicht privilegierte Benutzer ausgeführt werden. Dies ist bei mir nicht der Fall, ich habe root
die ganze Zeit gearbeitet. Als Antwort auf einen Kommentar grep systemd /var/log/syslog
gibt mir das Laufen nur Folgendes:
Jun 6 09:28:35 server systemd[22057]: Starting Paths.
Jun 6 09:28:35 server systemd[22057]: Reached target Paths.
Jun 6 09:28:35 server systemd[22057]: Starting Timers.
Jun 6 09:28:35 server systemd[22057]: Reached target Timers.
Jun 6 09:28:35 server systemd[22057]: Starting Sockets.
Jun 6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun 6 09:28:35 server systemd[22057]: Starting Basic System.
Jun 6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun 6 09:28:35 server systemd[22057]: Starting Default.
Jun 6 09:28:35 server systemd[22057]: Reached target Default.
Jun 6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun 6 09:37:08 server systemd[1]: Reexecuting.
quelle
grep systemd /var/log/syslog
Stopped target Default
weistStarting Shutdown
auf einzelne Dienste hin. Vielleicht ist es nur ein Konfigurationsproblem? Hinweis: Ich bin in diesem speziellen Fall auf Debian Jessie./etc/systemd/journald.conf
nicht überschrieben wurde , und suchen Sie an allen anderen Stellen, an denen Sie Journald wie unter aufgeführt konfigurieren können .MaxLevelStore
MaxLevelSyslog
man journald.conf
/etc/systemd
im Wesentlichen leer (alle Optionen sind auskommentiert, einschließlich der von Ihnen genannten).Antworten:
Wenn Sie ein Skript erstellen müssen, sollten Sie die Verwendung des
systemctl show
Befehls prüfen. Es ist für Skripte nützlicher, als zu versuchen, irgendetwas davon zu analysierenstatus
. Um beispielsweise herauszufinden, wann der Dienst zuletzt gestartet wurde, können Sie Folgendes verwenden:Wenn Sie alle verfügbaren Eigenschaften sehen möchten, lassen Sie einfach das Flag weg und es werden alle gelöscht.
Die Dokumentation zu diesen Eigenschaften finden Sie hier .
quelle
StatusErrno
undResult
? Ich würde mich fragen, ob sich diese ändern, wenn der Dienst fehlschlägt oder neu gestartet wird. Wenn Sie wirklich weiter gehen müssen, fügen Sie einenExecStopPost
Schritt hinzu, in dem Sie eine Datei berühren und beim Herunterfahren einen Zeitstempel aktualisieren. Dies hilft Ihnen, zwischen stillen und zielgerichteten Neustarts zu unterscheiden.Mit der Standardkonfiguration unter Debian hat ein nicht privilegierter Benutzer weder Zugriff auf die Protokolle systemd-journald noch auf syslog. Wenn Sie als normaler Benutzer angemeldet sind, erhalten Sie diese Antwort von journalctl:
Das ist ein bisschen verwirrend.
Wenn Sie als root angemeldet sind,
journalctl --unit=yourservice
sollten Sie die gesuchten Informationen erhalten. Nach einemsystemctl restart bind9
auf meinem Server erhalte ich Folgendesjournalctl --unit=bind9
:Wenn ich bind9 explizit mit töte
kill -9
,journalctl --unit=bind9
gibt es:Die erste Zeile zeigt an, dass der Prozess beendet wurde, weil er beendet wurde.
systemd-journald leitet auch alle Protokollnachrichten an syslog weiter, sodass Sie diese Nachrichten auch in finden sollten
/var/log/syslog
.Systemd und systemd-journald haben eine Standardkonfiguration, die in
/etc/systemd/system.conf
und geändert werden kann/etc/systemd/journald.conf
.Es kann nützlich sein zu wissen , dass standardmäßig, systemd-journald speichert die Protokolle unter
/run
, das isttmpfs
, und deshalb verschwindet nach einem Neustart. Dies bedeutet, dass Sie sich Syslog-Dateien ansehen müssen, um Protokollmeldungen zu erhalten, die älter als der letzte Start sind. In diesem Fall erhalten Sie mit journalctl keine Protokolle, die älter als der letzte Start sind. Dies kann/etc/systemd/journald.conf
durch Einstellen geändert werdenStorage=persistent
.Die Handbuchseiten, die dies dokumentieren, sind:
Beachten Sie außerdem, dass ein Dienst, der von systemd automatisch neu gestartet werden soll, in seiner
.service
Datei konfiguriert werden muss . Vonman 5 systemd.service
:quelle
systemd
angezeigt, die bei der Ausgabe des Journals wie von Ihnen beschrieben zugeordnet sind, obwohl ich die ganze Zeit als Root gearbeitet habe./var/log/syslog
zeigt auch nichts. Dies ist übrigens systemd 215.Sie können sehen, wann Ihr Dienst das letzte Mal gestartet oder neu gestartet wurde. Verwenden Sie
service chatty status
odersystemctl status chatty
. Hier sind Beispiele für den Apache2- oder httpd-Dienst:Die Zeile
Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago
zeigt, wie der Dienst ausgeführt wird, aber ich weiß nicht, ob Sie wie eine Liste genau das anzeigen können, wonach Sie suchen.quelle
service
ist ein alter Upstart-Befehl, der aus Kompatibilitätsgründen mit systemd zusammenarbeitet. Der nativesystemd
Befehl lautetsystemctl status apache2
.Wir können die
-f
Option verwenden, um nach Nachrichten aus dem Journal zu filtern ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).quelle