Как исправить атрибутивность юнита последних строк журнала systemd перед выходом?

Как исправить атрибутивность юнита последних строк журнала systemd перед выходом?

У меня есть служба systemd, которая пишет в stdout. Оттуда systemd перехватывает STDOUT и записывает его в журнал.

Я использую распространенную идиому для обработки ошибок, когда сначала echoвыполняется некоторая диагностика, а затем происходит выход с ненулевым кодом ошибки:

echo "my final error";
exit 1;

Моя проблема в том, что эта последняя echoстрока попадает в журнал, но не связана должным образом с моим "юнитом". Глядя на journalctl -o json-pretty, я могу увидеть, в чем разница. В последнем журнале отсутствуют свойства _SYSTEMD_CGROUP и _SYSTEMD_UNIT.

Я думаю, что происходит своего рода состояние гонки. Я подозреваю, что скрипт bash не дожидается journaldполной обработки перед переходом к строке выхода. Поэтому строка exitдостигается до journaldзавершения обработки записи журнала. journaldпытается найти , unitкоторый отправил журнал, но теперь не может его найти, так как устройство больше не работает.

Если я прав, я, вероятно, мог бы обойти эту проблему, поместив sleep 1перед своим exit 1утверждением , но есть ли лучший способ приписать свойство final logs?

Я использую systemdверсию 229 на Ubuntu 16.04.

решение1

@mark-stosberg, это известная проблема:journald не может приписывать сообщения, поступающие от процессов, которые завершились, своей cgroup из-за гонки /proc и SCM_CREDS

Обходной путь можно найти здесь:https://github.com/systemd/systemd/issues/2913#issuecomment-219702148

пытатьсяSyslogIdentifier=

Задает имя процесса в качестве префикса строк журнала, отправляемых в систему журналирования или буфер журнала ядра.

и бегиjournalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id

решение2

Я исследовал это, и, похоже, этоизвестная проблема с systemd, для которой есть запрос на извлечение.

Исправление включает кэширование метаданных для службы, так что даже если служба завершила работу, ее метаданные по-прежнему доступны для правильной категоризации последних нескольких журналов.

Это также считаетсяоткрытая ошибка в CoreOS, который использует systemd.

Ошибка также отслеживается в системе отслеживания ошибок systemd freedesktop.org под следующим именем:

Дальнейшее тестирование показало, что проблема отсутствия атрибуции журнала более серьезна припользовательединиц-- Я предполагаю, что это отдельный вопрос. Длясистемаединиц, состояние гонки относительно невелико, и добавление sleep 1;непосредственно перед выходом в скрипте службы может добавить достаточно заполнения перед последним напечатанным журналом и выходом, чтобы обойти эту проблему.

Связанный контент