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.
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
)
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}')"
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
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.
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 :-(
journalctl -r | grep -m1 foo.service