Чаще всего обновляются библиотеки — и тогда перезапуск нужен службам, чьи пакеты не менялись.
Общий код программы берут из общих библиотек — файлов .so: OpenSSL, zlib, libc. Библиотека отображается в память каждого процесса, который ей пользуется, и после её обновления каждый из них держит удалённый файл. Перебирать maps всех процессов вручную долго — это делает needrestart: он находит процессы с удалёнными программами и библиотеками и называет их службы.
apt после установки вызывает needrestart сам — так настроено в /etc/apt/apt.conf.d/99needrestart. После dpkg -i его запускают руками.
Найди службы со старой библиотекой
Ночью обновилась библиотека libexpat1 — разбор XML. Посмотри версию пакета и спроси needrestart, каким службам нужен перезапуск.
Сначала предположи
Обновился только пакет libexpat1, пакеты служб не менялись. Какие службы назовёт needrestart?
Теперь начни упражнение, выполни команду и сверь прогноз с выводом.
Одно обновление перезапуском служб не применить — ядро. Его загружают при старте машины, и работает оно до выключения. Новое ядро ставится рядом со старым, в /boot, а работает то, с которым машина загрузилась: его версию печатает uname -r. needrestart сравнивает их в строках NEEDRESTART-KCUR — работающее ядро — и NEEDRESTART-KEXP — самое новое из установленных. После установки ядра появляется и файл /run/reboot-required: серверу нужна перезагрузка.
После ночных обновлений sudo needrestart -b печатает NEEDRESTART-KCUR: 6.8.0-124-generic и NEEDRESTART-KEXP: 6.8.0-130-generic. Что сделаешь?
-
Службы работают поверх ядра, и их перезапуск ядро не меняет:
uname -rостанется6.8.0-124-generic. -
daemon-reexecперезапускает сам systemd, а ядро остаётся прежним:uname -r—6.8.0-124-generic. -
Работает ядро из
KCUR— 124. Установленное 130 заработает только после загрузки с ним.
Ядро загружается один раз при старте машины, поэтому новое ядро начнёт работать только после перезагрузки. Её планируют на время, когда простой меньше всего мешает.