Есть ли способ заставить logctl показывать логи из "последнего запуска foo.service"?
Я особенно заинтересован в том, чтобы посмотреть на выходные данные сервисов oneshot, которые работают по таймеру. --unit
Флаг близок, но он объединяет все запуски сервиса вместе. Самым очевидным способом, которым я могу придумать, является фильтрация по PID, но это заставляет меня беспокоиться о повторном использовании PID / службах, которые разветвляются, и получение последнего PID довольно неудобно. Есть ли какой-то другой идентификатор, который соответствует одному запуску службы, который я мог бы использовать для фильтрации журналов?
РЕДАКТИРОВАТЬ: Я бы с радостью принял авторитетное "нет", если это реальный ответ.
5 ответов
Я не уверен, какая временная метка имеет больше смысла, но это работает для меня. Надеюсь, есть лучший способ работы с метками времени из 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
У нас есть концепция ID вызова. Каждый раз, когда устройство запускается, оно имеет уникальный 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. Например
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 -u foo.service | хвост -n 2
или замените 2 на ожидаемое количество строк
journalctl -u foo.service --since = ' 2016-04-11 13:00:00 '
Вы также можете объединить их, чтобы сначала получить метку времени последнего запуска, а затем использовать эту метку с ключом --since.
Вы можете использовать флаг загрузки, чтобы получать только журналы из этой загрузки. например
journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5