Меня это особенно интересует, потому что я смотрю на вывод сервисов 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