Wie behebt man die Einheitenzuordnung der letzten Zeilen der Systemd-Protokollierung vor dem Beenden?

Wie behebt man die Einheitenzuordnung der letzten Zeilen der Systemd-Protokollierung vor dem Beenden?

Ich habe einen systemd-Dienst, der sich bei stdout anmeldet. Von dort erfasst systemd STDOUT und schreibt es in das Journal.

Ich verwende zur Fehlerbehandlung eine gängige Redewendung, bei der ich echoeinige Diagnosen durchführe und dann mit einem Fehlercode ungleich Null beende:

echo "my final error";
exit 1;

Mein Problem ist, dass diese letzte echoZeile im Journal erscheint, aber nicht richtig mit meiner „Unit“ verknüpft ist. Wenn ich mir anschaue journalctl -o json-pretty, kann ich den Unterschied erkennen. In der endgültigen Protokollierung fehlen die Eigenschaften _SYSTEMD_CGROUP und _SYSTEMD_UNIT.

Ich denke, dass hier eine Art Race Condition passiert. Ich vermute, dass das Bash-Skript nicht wartet, bis journalddie Verarbeitung abgeschlossen ist, bevor es zur Exit-Zeile übergeht. Die exitZeile wird also erreicht, bevor journalddie Verarbeitung des Protokolleintrags abgeschlossen ist. journaldversucht, den zu suchen unit, der die Protokollierung gesendet hat, kann ihn jetzt aber nicht finden, da die Einheit nicht mehr läuft.

Wenn ich Recht habe, könnte ich das Problem wahrscheinlich umgehen, indem ich es sleep 1vor meine exit 1Anweisung setze, aber gibt es eine bessere Möglichkeit, die Eigenschaft der endgültigen Protokolle zuzuweisen?

Ich verwende systemdVersion 229 auf Ubuntu 16.04.

Antwort1

@mark-stosberg, das ist ein bekanntes Problem:journald kann eingehende Nachrichten von beendeten Prozessen nicht ihrer Kontrollgruppe zuordnen, aufgrund des /proc vs. SCM_CREDS-Rennens

Dort finden Sie einen Workaround:https://github.com/systemd/systemd/issues/2913#issuecomment-219702148

versuchenSyslogIdentifier=

Legt den Prozessnamen fest, der den an das Protokollierungssystem oder den Kernel-Protokollpuffer gesendeten Protokollzeilen vorangestellt werden soll.

und Rennjournalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id

Antwort2

Ich habe das recherchiert und es scheint einbekanntes Problem mit systemd, für das es einen Pull Request gibt.

Die Lösung besteht darin, die Metadaten für den Dienst zwischenzuspeichern, so dass die Metadaten auch dann noch verfügbar sind, wenn der Dienst beendet wurde, um die letzten paar Protokolle richtig zu kategorisieren.

Es gilt auch als einoffener Fehler in CoreOS, das systemd verwendet.

Der Fehler wird auch im systemd-Bugtracker freedesktop.org wie folgt verfolgt:

Weitere Tests ergaben, dass das Problem der fehlenden Protokollzuordnung schwerwiegender ist beiBenutzerEinheiten - ich nehme an, das ist ein anderes Thema. FürSystemEinheiten, der Race Condition ist relativ gering und das Hinzufügen sleep 1;direkt vor dem Beenden im Serviceskript kann genügend Polsterung vor dem letzten gedruckten Protokoll und dem Beenden hinzufügen, um das Problem zu umgehen.

verwandte Informationen