web-dev-qa-db-fra.com

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

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.

44
Benjamin

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é. systemdexecs 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!)

48
Stephen Kitt

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.

4
Malvineous