Показать журналы журнала с момента перезапуска службы

Всякий раз, когда вы видите «опция X игнорируется» в выводе --help или на странице руководства, это означает: программа принимает вариант X - вы не получите синтаксической ошибки - но не имеет никакого эффекта. Программа делает то же самое, что и при отсутствии опции.

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

4
17.03.2019, 18:09
2 ответа

Вы можете использовать идентификатор вызова , который является уникальным идентификатором для конкретного запуска единицы обслуживания.

Она была введена в systemd v232, так что вам нужна по крайней мере эта версия systemd, чтобы это работало.

Чтобы получить идентификатор вызова текущего запуска службы:

$ unit=prometheus
$ systemctl show -p InvocationID --value "$unit"
0e486642eb5b4caeaa5ed1c56010d5cf

А затем искать записи журнала с прикрепленным к ним идентификатором вызова:

$ journalctl INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf + _SYSTEMD_INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf

Я обнаружил, что для получения всех журналов необходимы как INVOCATION _ID, так и _SYSTEMD _INVOCATION _ID. Последний добавляется systemd для вывода журналов самим устройством (, например. стандартный вывод процесса, работающего в этой службе ), в то время как первый привязан к событиям, принимаемым systemd (, например. Сообщения «Starting» и «Started» для этого устройства.)

Обратите внимание, что вам не нужно также фильтровать по имени устройства. Поскольку идентификатор вызова уникален, фильтрации по самому идентификатору достаточно, чтобы включить только журналы для интересующей вас службы.

5
27.01.2020, 20:57

Хотя я узнал что-то новое из ответа @filbranden и принял его, я обнаружил, что этот метод не обобщает. Например, если я хочу остановить службу и просмотреть журналы ее отключения, этот метод не работает, потому что у остановленной службы нет идентификатора вызова.

В итоге я использовал более простую технику ---просто сохраняя время перед командами и показывая все журналы с того времени.

status_from() { sudo systemctl status -l --no-pager -n0 $1; echo; sudo journalctl -f -u $1 -S "$2"; }
start() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl start $1; status_from $1 "$dt"; }
stop() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl stop $1; status_from $1 "$dt"; }
restart() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl restart $1; status_from $1 "$dt"; }
0
27.01.2020, 20:57

Теги

Похожие вопросы