Puis-je redémarrer systemd sans redémarrer?

39

J'essaie de redémarrer les services après yum updateRHEL 7.4. Je pourrais redémarrer chaque service en utilisant systemctl, mais needs-restartingfrom yum utilsme dit que je devrais aussi redémarrer systemd lui-même:

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

Puis-je redémarrer systemdsans redémarrer le serveur, et comment?

J'ai trouvé quelques mentions de systemctl daemon-reload, mais cela ne le fait pas disparaître de la liste des besoins en redémarrage.

Benjoin
la source

Réponses:

43

Pour redémarrer le démon, lancez

systemctl daemon-reexec

Ceci est documenté dans la systemctlpage de manuel :

Réexécutez le gestionnaire systemd. Cela sérialisera l'état du gestionnaire, réexécutera le processus et désérialisera à nouveau l'état. Cette commande est peu utile sauf pour le débogage et les mises à jour de paquet. Parfois, cela peut être utile comme poids lourd daemon-reload. Lors de la réexécution du démon, tous les sockets systemd écoutant pour le compte de la configuration de l'utilisateur resteront accessibles.

Malheureusement, needs-restartingimpossible de déterminer qui systemda réellement redémarré. systemd execslui-même pour redémarrer, ce qui ne réinitialise pas l'heure de début du processus; mais needs-restartingcompare l'heure de modification de l'exécutable avec l'heure de début du processus pour déterminer si un processus doit être redémarré (entre autres), et par conséquent, il considère toujours qu'il systemddoit être redémarré ... Pour déterminer s'il systemdfaut réellement redémarrer, vous pouvez vérifier la sortie de lsof -p1 | grep deleted: systemdutilise une bibliothèque, libsystemd-sharedqui est fournie dans le même package et est donc mise à niveau avec le démon. Par conséquent, si elle systemddoit être redémarrée, elle sera affichée à l'aide d'une version supprimée de la bibliothèque. Si lsofne montre aucun fichier supprimé, il systemdn'est pas nécessaire de le redémarrer. (Grâce àJeff Schaller pour l'indice!)

Stephen Kitt
la source
1
@Raman, daemon-reexecest supposé travailler même avec systemdle pid 1.
Stephen Kitt
3
Le nœud du redémarrage des besoins se résume à github.com/rpm-software-management/yum/blob/master/… où il interroge le "start_time" du PID; si le démon-reexec ne met pas à jour cette mise à jour, le redémarrage à faire restera "confus".
Jeff Schaller
1
Ne supposez pas que le chemin de code impliqué est bien testé, en particulier sur les systèmes non RedHat. Il est techniquement possible d'exécuter daemon-reexec, mais il est plus sûr de redémarrer.
Harald
2
@ Harald est utilisé à tout moment lorsque quelqu'un met systemdà jour Debian et ses dérivés, il est donc bien testé. C'est aussi assez simple (chercher do_reexecute).
Stephen Kitt
1
@StephenKitt - Lorsque j'essaie d'exécuter, lsof -p1 | grep deletedla sortie suivante est générée lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. En lecture ( unix.stackexchange.com/questions/171519/… ), il semble que même root ne puisse y accéder. Quelle serait l'alternative lsof -p1 | grep deleted?
Motivé le
3

Dans mon cas, je venais de mettre à niveau systemdet toute systemctlcommande échouait:

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

Cependant, selon la initpage de manuel, vous pouvez faire la même chose en envoyant SIGTERMau démon qui s'exécute en tant que PID 1, ce qui a fonctionné:

kill -TERM 1

Cela a rechargé le démon, après quoi toutes les systemctlcommandes ont recommencé à fonctionner.

Malvineux
la source