Для того, чтобы отслеживать этот момент, можно воспользоваться программой needrestart. Она есть в базовых репах:
# apt install needrestartВ rpm дистрибутивах название будет needs-restarting. Если просто запустить программу, то она в интерактивном режиме покажет, какие службы необходимо перезапустить, чтобы подгрузить обновлённые библиотеки, либо скажет, что надо перезапустить систему, чтобы применить обновление ядра.
Для того, чтобы использовать её в автоматизации, есть ключ
-b, batch mode:# needrestart -bNEEDRESTART-VER: 3.5NEEDRESTART-KCUR: 5.10.0-25-amd64NEEDRESTART-KEXP: 5.10.0-29-amd64NEEDRESTART-KSTA: 3NEEDRESTART-SVC: cron.serviceNEEDRESTART-SVC: dbus.serviceNEEDRESTART-SVC: getty@tty1.serviceNEEDRESTART-SVC: ifup@ens18.serviceNEEDRESTART-SVC: qemu-guest-agent.serviceNEEDRESTART-SVC: rsyslog.serviceNEEDRESTART-SVC: systemd-journald.serviceNEEDRESTART-SVC: systemd-logind.serviceNEEDRESTART-SVC: systemd-timesyncd.serviceNEEDRESTART-SVC: systemd-udevd.serviceЗдесь перечислены службы, которые нужно перезапустить после обновления системы. И показана информация об ядре. Значение NEEDRESTART-KSTA может принимать следующие состояния необходимости обновления ядра:
0: неизвестно, либо не удалось определить
1: нет необходимости в обновлении
2: ожидается какое-то ABI совместимое обновление (не понял, что это такое)
3: ожидается обновление версии
Если у вас значение 3, как у меня в примере, значит систему нужно перезагрузить, чтобы обновлённое ядро 5.10.0-29-amd64 заменило текущее загруженное 5.10.0-25-amd64.
Значение NEEDRESTART-KSTA можно передать в мониторинг и отслеживать необходимость перезагрузки. Например, В Zabbix можно передать вывод следующей команды:
# needrestart -b | grep 'NEEDRESTART-KSTA' | awk '{print $2}'Если на выходе будет 3, активируем триггер. Передать значение можно любым доступным способом, которому вы отдаёте предпочтение в своей инфраструктуре:
◽с помощью локального скрипта и параметра UserParameter в агенте
◽с помощью EnableRemoteCommands в агенте и ключа system.run на сервере
◽с помощью zabbix_sender
◽с помощью скрипта и передачи значения ключа напрямую в сервер через его API
Zabbix в этом плане очень гибкая система, предлагает разные способы решения одной и той же задачи.
После перезагрузки значение NEEDRESTART-KSTA станет равно единице:
# needrestart -bNEEDRESTART-VER: 3.5NEEDRESTART-KCUR: 5.10.0-29-amd64NEEDRESTART-KEXP: 5.10.0-29-amd64NEEDRESTART-KSTA: 1В выводе не будет ни одной службы, которую следует перезапустить. Если нет системы мониторинга, но есть система сбора логов, то можно вывод отправить туда и там уже следить за службами и состоянием ядра.
Покажу, как строку сразу преобразовать в нормальный json, чтобы потом можно было легко анализировать:
# needrestart -b | tr ':' '=' | tr -d ' ' | jo -p{ "NEEDRESTART-VER": 3.5, "NEEDRESTART-KCUR": "5.10.0-29-amd64", "NEEDRESTART-KEXP": "5.10.0-29-amd64", "NEEDRESTART-KSTA": 1}Обработал в лоб. Взял утилиту jo, заменил
: на = c помощью tr, потому что jo понимает только =, потом убрал лишние пробелы опять же с помощью tr. Получили чистый json, из которого с помощью jsonpath можно забрать необходимое для анализа значение.# needrestart -b | tr ':' '=' | tr -d ' ' | jo -p | jq .'"NEEDRESTART-KSTA"'1Придумал это без помощи ChatGPT. Даже не знаю уже, хорошо это или плохо. По привычке трачу время и пишу такие штуки сам.
#linux #мониторинг