Могу ли я перезапустить systemd без перезагрузки?

39

Я пытаюсь перезапустить службы после yum updateна RHEL 7.4. Я мог бы перезапустить каждый сервис, используя systemctl, но needs-restartingиз него yum utilsсказал, что мне следует перезапустить и сам systemd:

# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21

Можно ли systemdперезагрузить сервер без перезагрузки и как?

Я нашел несколько упоминаний о systemctl daemon-reload, но это не заставляет его исчезать из списка перезапуска потребностей.

Вениамин
источник

Ответы:

43

Чтобы перезапустить демон, запустите

systemctl daemon-reexec

Это задокументировано на systemctlстранице руководства :

Повторно запустите системный менеджер. Это позволит сериализовать состояние диспетчера, повторно выполнить процесс и снова десериализовать состояние. Эта команда мало полезна, за исключением отладки и обновления пакетов. Иногда это может быть полезно как тяжеловес daemon-reload. Во время повторного выполнения демона все сокеты, прослушиваемые systemd от имени пользовательской конфигурации, будут оставаться доступными.

К сожалению, needs-restartingне могу определить, что на systemdсамом деле перезапустил. systemd execsсам перезапустить, что не сбрасывает время запуска процесса; но needs-restartingсравнивает время модификации исполняемого файла со временем запуска процесса, чтобы определить, должен ли процесс быть перезапущен (среди прочего), и в результате он всегда считает, что systemdдолжен быть перезапущен ... Чтобы определить, systemdдействительно ли нужно перезапускать, вы можете проверить вывод lsof -p1 | grep deleted: systemdиспользует библиотеку, libsystemd-sharedкоторая поставляется в том же пакете и, таким образом, обновляется вместе с демоном, поэтому при systemdнеобходимости перезапуска вы увидите ее, используя удаленную версию библиотеки. Если lsofпоказывает, что удаленных файлов systemdнет, перезапускать не нужно. (БлагодаряДжефф Шаллер за подсказку!)

Стивен Китт
источник
1
@Raman, daemon-reexecдолжен работать даже с systemdpid 1.
Стивен Китт
3
Суть перезапуска потребностей сводится к github.com/rpm-software-management/yum/blob/master/…, где он запрашивает PID «start_time»; если daemon-reexec не обновляет это, перезапуск потребностей останется «запутанным».
Джефф Шаллер
1
Не думайте, что какой-либо задействованный кодовый путь хорошо протестирован, особенно в системах, отличных от RedHat. Технически возможно запустить daemon-reexec, но безопаснее перезагрузить компьютер.
Харальд
2
@Harald он используется каждый раз, когда кто-либо обновляет systemdDebian и его производные, поэтому он хорошо протестирован. Это также достаточно просто (ищите do_reexecute).
Стивен Китт
1
@StephenKitt - Когда я пытаюсь запустить, lsof -p1 | grep deletedгенерируется следующий вывод lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. При чтении ( unix.stackexchange.com/questions/171519/… ) кажется, что даже root не может получить к нему доступ. Какой будет альтернатива lsof -p1 | grep deleted?
Мотивировано
3

В моем случае я только что обновился, systemdи любая systemctlкоманда не работала:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

Однако, в соответствии с initman-страницей, вы можете сделать то же самое, отправив SIGTERMдемону, работающему как PID 1, который сработал:

kill -TERM 1

Это перезагрузило демон, после чего все systemctlкоманды снова начали работать.

Malvineous
источник