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 a échoué silencieusement et a été réapparue par systemd, ou si un utilisateur a volontairement redémarré le service via systemctl
.
L'historique du shell ne montre pas une telle activité, mais cela n'est pas concluant à cause export HISTCONTROL=ignoreboth
et parce qu'une session SSH peut avoir juste expiré, empêchant l'historique bash d'une connexion précédente d'être écrit 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é volontairement 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 le problème typique que les gens peuvent rencontrer est qu'ils s'exécutent en journalctl
tant qu'utilisateur non privilégié. Ce n'est pas le cas pour moi, j'opère depuis root
toujours. En réponse à un commentaire, courir grep systemd /var/log/syslog
ne me donne que 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.
la source
grep systemd /var/log/syslog
Stopped target Default
,Starting Shutdown
etc. Rien n'indiquant rien sur les services individuels. C'est peut-être juste un problème de configuration? Remarque Je suis sur Debian Jessie dans ce cas particulier./etc/systemd/journald.conf
pas remplacéMaxLevelStore
ouMaxLevelSyslog
et recherchez dans tous les autres endroits où vous pouvez configurer journald comme indiqué dansman journald.conf
./etc/systemd
sont essentiellement vides (toutes les options ont été commentées, y compris celles que vous avez mentionnées).Réponses:
Si vous avez besoin de créer un script, vous devriez envisager d'utiliser la
systemctl show
commande. Il est plus utile pour les scripts que d'essayer d'analyser quoi que ce soitstatus
. Par exemple, pour savoir quand le service a démarré pour la dernière fois, vous pouvez utiliser:Si vous souhaitez voir toutes les propriétés disponibles, omettez simplement l'indicateur et il les supprimera toutes.
La documentation de ces propriétés se trouve ici .
la source
StatusErrno
etResult
? Je me demande si ceux-ci changent si le service a échoué ou a été redémarré. Si vous devez vraiment aller plus loin, essayez d'ajouter uneExecStopPost
étape où vous touchez un fichier et mettez à jour un horodatage à l'arrêt. Cela vous aidera à faire la différence entre les redémarrages silencieux et les redémarrages ciblés.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:
ce qui est un peu déroutant.
Si vous êtes connecté en tant que root,
journalctl --unit=yourservice
devrait vous donner les informations que vous recherchez. Après unsystemctl restart bind9
sur mon serveur, j'obtiens ceci aprèsjournalctl --unit=bind9
:Si je tue explicitement bind9 avec
kill -9
,journalctl --unit=bind9
donne: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 compilée par défaut 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
, ce qui esttmpfs
, 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é en/etc/systemd/journald.conf
définissantStorage=persistent
.Les pages de manuel qui documentent ceci sont:
Notez également que pour qu'un service soit redémarré automatiquement par systemd, cela doit être configuré dans son
.service
fichier. Deman 5 systemd.service
:la source
systemd
sortie du journal comme vous l'avez décrit, même si j'ai toujours travaillé en tant que root./var/log/syslog
ne montre rien non plus. C'est d'ailleurs Systemd 215.Vous pouvez voir la dernière fois que votre service a démarré ou redémarré. Utilisez
service chatty status
ousystemctl status chatty
. Voici des exemples pour le service apache2 ou httpd: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 recherchez.la source
service
est une ancienne commande Upstart qui fonctionne avec systemd pour la compatibilité. Lasystemd
commande native estsystemctl status apache2
.Nous pouvons utiliser l'
-f
option pour filtrer les messages du journal ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).la source