¿Puedo reiniciar systemd sin reiniciar?

39

Estoy tratando de reiniciar los servicios después de un yum updateen RHEL 7.4. Podría reiniciar todos los servicios usando systemctl, pero needs-restartingdesde yum utilsme dice que también debería reiniciar systemd:

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

¿Puedo reiniciar systemdsin reiniciar el servidor y cómo?

Encontré algunas menciones systemctl daemon-reload, pero esto no hace que desaparezca de la lista de reinicio de necesidades.

Benjamín
fuente

Respuestas:

43

Para reiniciar el demonio, ejecuta

systemctl daemon-reexec

Esto está documentado en la página de systemctlmanual :

Vuelva a ejecutar el administrador de systemd. Esto serializará el estado del administrador, volverá a ejecutar el proceso y deserializará el estado nuevamente. Este comando es de poca utilidad, excepto para la depuración y las actualizaciones de paquetes. A veces, puede ser útil como un peso pesado daemon-reload. Mientras el demonio se está volviendo a ejecutar, todos los sockets del sistema que escuchan en nombre de la configuración del usuario permanecerán accesibles.

Lamentablemente needs-restarting, no puedo determinar que systemdrealmente se haya reiniciado. systemd execsreiniciar, lo que no restablece la hora de inicio del proceso; pero needs-restartingcompara el tiempo de modificación del ejecutable con el tiempo de inicio del proceso para determinar si un proceso necesita reiniciarse (entre otras cosas) y, como resultado, siempre considera que systemddebe reiniciarse ... Para determinar si systemdrealmente necesita reiniciarse, puede verificar la salida de lsof -p1 | grep deleted: systemdutiliza una biblioteca, libsystemd-sharedque se envía en el mismo paquete y, por lo tanto, se actualiza junto con el demonio, por lo que si systemdnecesita reiniciarse, lo verá usando una versión eliminada de la biblioteca. Si lsofno muestra archivos borrados, systemdno necesita reiniciarse. (Gracias aJeff Schaller por la pista!)

Stephen Kitt
fuente
1
@Raman, daemon-reexecse supone que funciona incluso systemdcomo pid 1.
Stephen Kitt
3
El quid de las necesidades de reinicio se reduce a github.com/rpm-software-management/yum/blob/master/… donde consulta el "tiempo_inicio" del PID; si el daemon-reexec no actualiza eso, las necesidades de reinicio permanecerán "confundidas".
Jeff Schaller
1
No asuma que cualquier ruta de código involucrada está bien probada, especialmente en sistemas que no son RedHat. Es técnicamente posible ejecutar daemon-reexec, pero es más seguro reiniciar.
Harald el
2
@Harald se usa cada vez que alguien actualiza systemdDebian y derivados, por lo que está bien probado. También es razonablemente sencillo (buscar do_reexecute).
Stephen Kitt el
1
@StephenKitt: cuando intento ejecutar, lsof -p1 | grep deletedse genera la siguiente salida lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. En lectura ( unix.stackexchange.com/questions/171519/… ), parece que incluso la raíz no puede acceder a ella. ¿Cuál sería la alternativa lsof -p1 | grep deleted?
Motivado
3

En mi caso, acababa de actualizar systemdy systemctlfallaba cualquier comando:

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

Sin embargo, de acuerdo con la página de initmanual, puede hacer lo mismo enviando SIGTERMal demonio que se ejecuta como PID 1, que funcionó:

kill -TERM 1

Esto volvió a cargar el demonio, después de lo cual todos los systemctlcomandos comenzaron a funcionar nuevamente.

Malvinoso
fuente