web-dev-qa-db-fra.com

Comment savoir quand un service systemd a été démarré / arrêté / redémarré?

J'ai un service (écrit par moi-même) fonctionnant sur un serveur Debian (Jessie), et les propres journaux du service indiquent qu'il a redémarré à un moment particulier. Il n'y a aucune indication d'une erreur de segmentation ou d'un autre plantage, donc j'essaie maintenant de savoir si l'application en quelque sorte en silence a échoué et a été réapparue par systemd, ou si un utilisateur a volontairement redémarré le service via systemctl.

L'histoire de Shell ne montre pas une telle activité, mais ce n'est pas concluant à cause de export HISTCONTROL=ignoreboth et parce qu'une session SSH vient de se terminer, empêchant l'écriture de l'historique bash d'une connexion précédente sur le disque. Le serveur n'a pas été redémarré à l'époque.

Mais je m'attendrais à ce que systemd lui-même conserve un journal indiquant quand un service a été exprès redémarré. À ma grande surprise, je n'ai pas pu trouver de documentation (par exemple pour journalctl) sur la façon d'obtenir de tels journaux.

Certains autres messages (par exemple Où est/pourquoi n'y a-t-il pas de journal pour les services systemd de l'utilisateur normal? ) semblent indiquer qu'il devrait y avoir des messages de journal comme celui-ci:

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.

Mais je ne vois pas de tels messages de journal sur mon système.

Existe-t-il un moyen de savoir quand les services systemd ont été démarrés, arrêtés ou redémarrés?

Edit : Il semble que les gens rencontrent généralement le problème qu'ils exécutent journalctl en tant qu'utilisateur non privilégié. Ce n'est pas le cas pour moi, j'ai toujours fonctionné en tant que root. En réponse à un commentaire, exécutez grep systemd /var/log/syslog me donne seulement ceci:

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

Si vous avez besoin de créer un script, vous devriez envisager d'utiliser le systemctl show commande. Il est plus utile pour les scripts que d'essayer d'analyser quoi que ce soit à partir de status. Par exemple, pour savoir quand le service a démarré pour la dernière fois, vous pouvez utiliser:

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

Si vous souhaitez voir toutes les propriétés disponibles, omettez simplement l'indicateur et il les supprimera toutes.

$ systemctl show <service_name>

La documentation de ces propriétés peut être trouvée ici .

11
jdf

Avec la configuration par défaut sur Debian, un utilisateur non privilégié n'aura accès ni aux journaux systemd-journald, ni à Syslog. Si vous êtes connecté en tant qu'utilisateur normal, vous recevrez cette réponse de journalctl:

$ journalctl 
No journal files were found.

ce qui est un peu déroutant.

Si vous êtes connecté en tant que root, journalctl --unit=yourservice devrait vous fournir les informations que vous recherchez. Après un systemctl restart bind9 sur mon serveur, j'obtiens ceci après 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.

Si je tue explicitement bind9 avec kill -9, journalctl --unit=bind9 donne:

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.

La première ligne indique que le processus est mort parce qu'il a été tué.

systemd-journald transmet également tous les messages de journal à syslog, vous devriez donc également trouver ces messages dans /var/log/syslog.

Systemd et systemd-journald ont une configuration par défaut compilée qui peut être modifiée dans /etc/systemd/system.conf et /etc/systemd/journald.conf.

Il peut être utile de savoir que par défaut, systemd-journald stocke les journaux sous /run, qui est tmpfs, et disparaît donc après un redémarrage. Cela signifie que pour obtenir des messages de journal plus anciens que le dernier démarrage, vous devrez regarder les fichiers syslog. Dans ce cas, journalctl ne vous donnera pas de journaux plus anciens que le dernier démarrage. Cela peut être modifié dans /etc/systemd/journald.conf en définissant Storage=persistent.

Les pages de manuel qui documentent ceci sont:

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

Notez également que pour qu'un service soit redémarré automatiquement par systemd, cela doit être configuré dans son .service fichier. De 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

Vous pouvez voir la dernière fois que votre service a démarré ou redémarré. Utilisez service chatty status Ou systemctl status chatty. Voici des exemples de service Apache2 ou httpd:

# 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

la ligne Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago montre depuis comment le service fonctionne mais je ne sais pas si vous pouvez afficher comme une 'liste' exactement ce que vous cherchez.

# 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

On peut utiliser -f option pour filtrer les messages du journal ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).

journalctl -f _TRANSPORT=journal example
0
Chris Stryczynski