J'essaie de redémarrer les services après un yum update
sur RHEL 7.4. Je pouvais redémarrer tous les services en utilisant systemctl, mais needs-restarting
de yum utils
me dit que je devrais également redémarrer systemd lui-même:
# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21
Puis-je redémarrer systemd
sans 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 de redémarrage.
Pour redémarrer le démon, exécutez
systemctl daemon-reexec
Ceci est documenté dans la page de manuel systemctl
:
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 à niveau de packages. Parfois, cela peut être utile en tant que poids lourd
daemon-reload
. Pendant que le démon est en cours de réexécution, toutes les sockets systemd écoutant au nom de la configuration utilisateur resteront accessibles.
Malheureusement needs-restarting
ne peut pas déterminer que systemd
a réellement redémarré. systemd
execs
lui-même pour redémarrer, ce qui ne réinitialise pas l'heure de début du processus; mais needs-restarting
compare 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 que systemd
doit être redémarré ... Pour déterminer si systemd
doit vraiment être redémarré, vous pouvez vérifier la sortie de lsof -p1 | grep deleted
: systemd
utilise une bibliothèque, libsystemd-shared
, qui est livré dans le même package et est donc mis à niveau avec le démon, donc si systemd
doit être redémarré, vous le verrez en utilisant une version supprimée de la bibliothèque. Si lsof
n'affiche aucun fichier supprimé, systemd
n'a pas besoin d'être redémarré. (Merci à Jeff Schaller pour l'astuce!)
Dans mon cas, je venais de mettre à jour systemd
et toute commande systemctl
échouait:
# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied
Cependant, selon la page de manuel init
, vous pouvez faire la même chose en envoyant SIGTERM
au démon fonctionnant en tant que PID 1, ce qui a fonctionné:
kill -TERM 1
Cela a rechargé le démon, après quoi toutes les commandes systemctl
ont recommencé à fonctionner.