Есть ли способ заставить 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

Journalctl -r | grep -m1 foo.service

Другие вопросы по тегам