Чи можу я перезапустити systemd без перезавантаження?


39

Я намагаюся перезапустити послуги після yum updateRHEL 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. Поки демон демонструється, усі сокети, які систематизовано слухати від імені користувальницької конфігурації, залишатимуться доступними.

На жаль, 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/…, де він запитує "start_time" PID; якщо daemon-reexec цього не оновить, перезапуск потреби залишиться "заплутаним".
Jeff Schaller

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

Однак, згідно з даними сторінки init, ви можете зробити те ж саме, відправивши SIGTERMдемон, який працює як PID 1, який працював:

kill -TERM 1

Це перезавантажило демон, після чого всі systemctlкоманди знову почали працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.