it-swarm.com.de

Wie sehe ich, wann ein systemd-Dienst gestartet / gestoppt / neu gestartet wurde?

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 irgendwie stillschweigend fehlgeschlagen ist und von systemd erneut gestartet wurde oder ob ein Benutzer die Anwendung absichtlich neu gestartet hat Service über systemctl.

Der Shell-Verlauf zeigt keine solche Aktivität an, aber das ist nicht schlüssig, da export HISTCONTROL=ignoreboth Und eine SSH-Sitzung möglicherweise gerade abgelaufen ist, wodurch 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) zum Abrufen solcher Protokolle finden.

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 sie journalctl als nicht privilegierter Benutzer ausführen. Dies ist bei mir nicht der Fall, ich habe die ganze Zeit als root gearbeitet. Als Antwort auf einen Kommentar gibt mir das Ausführen von grep systemd /var/log/syslog 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.
12
mindriot

Wenn Sie ein Skript erstellen müssen, sollten Sie den Befehl systemctl show Verwenden. Es ist für Skripte nützlicher, als zu versuchen, etwas von status zu analysieren. Um beispielsweise herauszufinden, wann der Dienst zuletzt gestartet wurde, können Sie Folgendes verwenden:

$ systemctl show systemd-journald --property=ActiveEnterTimestamp
ActiveEnterTimestamp=Wed 2017-11-08 05:55:17 UTC

Wenn Sie alle verfügbaren Eigenschaften sehen möchten, lassen Sie einfach das Flag weg und es werden alle gelöscht.

$ systemctl show <service_name>

Die Dokumentation zu diesen Eigenschaften finden Sie hier .

11
jdf

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:

$ journalctl 
No journal files were found.

das ist ein bisschen verwirrend.

Wenn Sie als root angemeldet sind, sollte journalctl --unit=yourservice Ihnen die Informationen geben, nach denen Sie suchen. Nach einem systemctl restart bind9 Auf meinem Server erhalte ich dies nach journalctl --unit=bind9:

Jun 03 18:20:24 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:20:24 ns named[27605]: received control channel command 'stop'
Jun 03 18:20:24 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:20:24 ns systemd[1]: Started BIND Domain Name Server.

Wenn ich bind9 explizit mit kill -9 Töte, gibt journalctl --unit=bind9:

Jun 03 18:46:25 ns systemd[1]: bind9.service: main process exited, code=killed, status=9/KILL
Jun 03 18:46:25 ns rndc[28028]: rndc: connect failed: 127.0.0.1#953: connection refused
Jun 03 18:46:25 ns systemd[1]: bind9.service: control process exited, code=exited status=1
Jun 03 18:46:25 ns systemd[1]: Unit bind9.service entered failed state.
Jun 03 18:46:25 ns systemd[1]: bind9.service holdoff time over, scheduling restart.
Jun 03 18:46:25 ns systemd[1]: Stopping BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Starting BIND Domain Name Server...
Jun 03 18:46:25 ns systemd[1]: Started BIND Domain Name Server.

Die erste Zeile zeigt an, dass der Prozess beendet wurde, weil er beendet wurde.

systemd-journald leitet auch alle Protokollnachrichten an syslog weiter, daher sollten Sie diese Nachrichten auch in /var/log/syslog finden.

Systemd und systemd-journald haben eine in der Konfiguration kompilierte Standardeinstellung, die in /etc/systemd/system.conf Und /etc/systemd/journald.conf Geändert werden kann.

Es kann nützlich sein zu wissen, dass systemd-journald die Protokolle standardmäßig unter /run Speichert, was tmpfs ist, und daher nach einem Neustart verschwindet. 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 in /etc/systemd/journald.conf Durch Setzen von Storage=persistent Geändert werden.

Die Handbuchseiten, die dies dokumentieren, sind:

man 8 systemd-journald
man 5 journald.conf
man 5 systemd-system.conf
man 5 systemd-user.conf

Beachten Sie außerdem, dass ein Dienst, der von systemd automatisch neu gestartet werden soll, in der Datei .service Konfiguriert werden muss. Von man 5 systemd.service:

   Restart=
       Configures whether the service shall be
       restarted when the service process exits, is
       killed, or a timeout is reached. The service
       process may be the main service process, but it
       may also be one of the processes specified with
       ExecStartPre=, ExecStartPost=, ExecStop=,
       ExecStopPost=, or ExecReload=. When the death
       of the process is a result of systemd operation
       (e.g. service stop or restart), the service
       will not be restarted. Timeouts include missing
       the watchdog "keep-alive ping" deadline and a
       service start, reload, and stop operation
       timeouts.

       Takes one of no, on-success, on-failure,
       on-abnormal, on-watchdog, on-abort, or always.
       If set to no (the default), the service will
       not be restarted.
3
Tom Bjerck

Sie können sehen, wann Ihr Dienst das letzte Mal gestartet oder neu gestartet wurde. Verwenden Sie service chatty status Oder systemctl status chatty. Hier sind Beispiele für den Apache2- oder httpd-Dienst:

# service Apache2 status
● Apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/Apache2)
  Drop-In: /lib/systemd/system/Apache2.service.d
       └─forking.conf
   Active: active (running) since ven. 2017-06-02 15:53:01 CEST; 21min ago
  Process: 14773 ExecStop=/etc/init.d/Apache2 stop (code=exited, status=0/SUCCESS)
  Process: 22912 ExecReload=/etc/init.d/Apache2 reload (code=exited, status=0/SUCCESS)
  Process: 14880 ExecStart=/etc/init.d/Apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/Apache2.service

die Zeile Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago zeigt an, wie der Dienst ausgeführt wird, aber ich weiß nicht, ob Sie wie eine 'Liste' genau das anzeigen können, wonach Sie suchen.

# systemctl status httpd

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-10-11 00:35:58 EEST; 1 weeks 3 days ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 29728 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
 Main PID: 10722 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   Memory: 8.7M
3
klaypez

Wir können benutzen -f Option zum Filtern nach Nachrichten aus dem Journal ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).

journalctl -f _TRANSPORT=journal example
0