web-dev-qa-db-fra.com

Existe-t-il un moyen de faire en sorte que journalctl affiche les journaux à partir de "la dernière exécution de foo.service"?

Je suis particulièrement intéressé par cela pour regarder la sortie des services oneshot qui s'exécutent sur une minuterie. Le --unit flag est proche, mais il concatène toutes les exécutions du service ensemble. La façon la plus évidente à laquelle je peux penser serait de filtrer sur PID, mais cela me fait me soucier de la réutilisation/des services PID qui débouchent, et obtenir le dernier PID est assez gênant. Existe-t-il un autre identifiant qui correspond à une seule exécution d'un service, que je pourrais utiliser pour filtrer les journaux?

EDIT: Je serais heureux d'accepter un "non" faisant autorité si c'est la vraie réponse.

16
Jack O'Connor

Depuis systemd version 232, nous avons le concept d'ID d'invocation. Chaque fois qu'une unité est exécutée, elle a un ID d'appel 128 bits unique. Contrairement à MainPID qui peut être recyclé ou ActiveEnterTimestamp qui peut avoir des problèmes de résolution, c'est un moyen infaillible d'obtenir tout le journal d'une invocation d'unité systemd particulière.

Pour obtenir le dernier ID d'appel d'une unité

$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b

Pour obtenir le journal de la dernière invocation de, disons, openipmi, qu'elle ait échoué ou non, vous pouvez utiliser le liner

$ journalctl _SYSTEMD_INVOCATION_ID=`systemctl show -p InvocationID --value openipmi.service`
-- Logs begin at Thu 2018-07-26 12:09:57 IDT, end at Mon 2019-07-08 01:32:50 IDT. --
Jun 21 13:03:13 build03.lbits openipmi[1552]:  * Starting ipmi drivers
Jun 21 13:03:13 build03.lbits openipmi[1552]:    ...fail!
Jun 21 13:03:13 build03.lbits openipmi[1552]:    ...done.

(Notez que le --value est disponible depuis systemd 230, plus ancien que InvocationID)

8
Elazar Leibovich

Je ne sais pas quel horodatage a le plus de sens, mais cela fonctionne pour moi. Espérons qu'il existe une meilleure façon de travailler avec les horodatages de systemctl show que awk - n'a pas pu comprendre comment contrôler le format des horodatages.

unit=foo.service

ts=$(systemctl show -p ActiveEnterTimestamp $unit)

echo $ts
ActiveEnterTimestamp=Fri 2016-11-11 12:30:01 MST

journalctl -u $unit --since "$(echo $ts | awk '{print $2 $3}')"
14
Erik Stephens

Vous pouvez utiliser l'indicateur de démarrage pour extraire uniquement les journaux de ce démarrage. par exemple

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5
4
Nikolaidis Fotis

Cela pourrait vous aider:

  • journalctl -u foo.service | queue -n 2

    ou remplacez 2 par le nombre de lignes attendu

  • journalctl -u foo.service --since = '2016-04-11 13:00:'

Vous pouvez également les combiner pour obtenir d'abord l'horodatage de la dernière exécution, puis utiliser cet horodatage avec le commutateur --since.

4
Breign

Vous pouvez utiliser des filtres de champ avec Journalctl. Par exemple.

journalctl _PID=1234

Obtenez une liste de tous les champs disponibles en utilisant:

journalctl --fields --unit kubelet

Un champ disponible est _PID.

Vous pouvez obtenir le PID d'un processus en cours d'exécution à l'aide de pidof ou systemctl show --property MainPID <SERVICE_NAME>

Voici donc comment obtenir les journaux du processus de kubelet Kubernetes actuel:

# journalctl --unit kubelet _PID=$(systemctl show --property MainPID kubelet 2>/dev/null | cut -d= -f2) | head

Maintenant, dites-moi pourquoi I Kubernetes est si difficile à installer :-(

3
richardw

journalctl -r | grep -m1 foo.service

0
nieman