Назад | Перейти на главную страницу

Есть ли способ сделать журналы журнала journalctl с момента последнего запуска foo.service?

Меня это особенно интересует, потому что я смотрю на вывод сервисов oneshot, которые работают по таймеру. В --unit flag близок, но он объединяет все запуски службы вместе. Самый очевидный способ, который я могу придумать, - это фильтровать по PID, но это заставляет меня беспокоиться о повторном использовании PID / службах, которые разветвляются, и получение последнего PID довольно неудобно. Есть ли какой-то другой идентификатор, соответствующий одному запуску службы, который я мог бы использовать для фильтрации журналов?

РЕДАКТИРОВАТЬ: Я с радостью приму авторитетное «нет», если это настоящий ответ.

Я не уверен, какая временная метка имеет наибольшее значение, но это работает для меня. Надеюсь, есть лучший способ работы с отметками времени из systemctl show чем awk - не мог понять, как управлять форматом временных меток.

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}')"

поскольку systemd версия 232, у нас есть понятие идентификатора вызова. Каждый раз, когда модуль запускается, он имеет уникальный 128-битный идентификатор вызова. в отличие MainPID которые могут быть переработаны, или ActiveEnterTimestamp который может иметь проблемы с разрешением, это надежный способ получить весь журнал вызова конкретного модуля systemd.

Чтобы получить последний идентификатор вызова модуля

$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b

Чтобы получить журнал последнего вызывания, скажем, openipmi, независимо от того, вышло ли оно из строя или нет, вы можете использовать один лайнер

$ 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.

(Обратите внимание, что --value доступен с systemd 230, старше чем InvocationID)

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

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5

Они могут вам помочь:

  • journalctl -u foo.service | хвост -n 2

    или заменить 2 с ожидаемым количеством строк

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

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

Вы можете использовать фильтры полей с Journalctl. Например.

journalctl _PID=1234

Получите список всех доступных полей, используя:

journalctl --fields --unit kubelet

Одно доступное поле - _PID.

Вы можете получить PID запущенного процесса, используя pidof или systemctl show --property MainPID <SERVICE_NAME>

Итак, вот как я получаю логи текущего процесса Kubernetes kubelet:

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

А теперь скажите, почему мне так сложно установить Kubernetes :-(

journalctl -r | grep -m1 foo.service