Kann ich systemd ohne Neustart neu starten?

39

Ich versuche, Dienste nach einem yum updateauf RHEL 7.4 neu zu starten . Ich könnte jeden Dienst mit systemctl neu starten, aber needs-restartingfrom yum utilssagt mir, dass ich auch systemd selbst neu starten soll:

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

Kann ich neu starten, systemdohne den Server neu zu starten , und wie?

Ich habe ein paar Erwähnungen von gefunden systemctl daemon-reload, aber das lässt es nicht von der Liste der Neustarts verschwinden.

Benjamin
quelle

Antworten:

43

Führen Sie den folgenden Befehl aus, um den Dämon neu zu starten

systemctl daemon-reexec

Dies ist in der systemctlManpage dokumentiert :

Führen Sie den systemd-Manager erneut aus. Dadurch wird der Manager-Status serialisiert, der Prozess erneut ausgeführt und der Status erneut deserialisiert. Dieser Befehl ist nur für das Debuggen und Aktualisieren von Paketen von Nutzen. Manchmal kann es als Schwergewicht hilfreich sein daemon-reload. Während der erneuten Ausführung des Dämons bleibt der Zugriff auf alle Sockets erhalten, die das System im Auftrag der Benutzerkonfiguration überwacht.

Leider needs-restartingkann nicht festgestellt werden, dass systemdtatsächlich neu gestartet wurde. systemd execssich selbst neu zu starten, wodurch die Startzeit des Prozesses nicht zurückgesetzt wird; sondern needs-restartingvergleicht die Änderungszeit ausführbare Datei mit der Startzeit des Prozesses zu bestimmen , ob ein Prozess muss neu gestartet werden (unter anderem), und als Ergebnis ihrer Ansicht immer , dass systemdmuss neu gestartet werden ... Um zu bestimmen , ob systemdwirklich neu gestartet werden muss, Sie können die Ausgabe von überprüfen lsof -p1 | grep deleted: systemdverwendet eine Bibliothek, libsystemd-shareddie im selben Paket enthalten ist und daher zusammen mit dem Dämon aktualisiert wird. Wenn systemdalso ein Neustart erforderlich ist, wird diese mit einer gelöschten Version der Bibliothek angezeigt. Wenn lsofkeine gelöschten Dateien angezeigt werden, systemdmuss nicht neu gestartet werden. (Dank anJeff Schaller für den Hinweis!)

Stephen Kitt
quelle
1
@Raman, daemon-reexecsoll sogar mit systemdPID 1 arbeiten.
Stephen Kitt
3
Der Knackpunkt beim Neustart von Anforderungen ist github.com/rpm-software-management/yum/blob/master/…, wo die "start_time" der PID abgefragt wird. Wenn der Daemon-Reexec das nicht aktualisiert, bleibt der Neustart "verwirrt".
Jeff Schaller
1
Gehen Sie nicht davon aus, dass ein beteiligter Codepfad gut getestet ist, insbesondere auf Nicht-RedHat-Systemen. Es ist technisch möglich, daemon-reexec auszuführen, aber es ist sicherer, einen Neustart durchzuführen.
Harald
2
@Harald Es wird immer dann verwendet, wenn jemand ein Upgrade systemdauf Debian und Derivate durchführt. Es ist also gut getestet. Es ist auch einigermaßen einfach do_reexecute.
Stephen Kitt
1
@StephenKitt - Wenn ich versuche, lsof -p1 | grep deleteddie folgende Ausgabe auszuführen, wird generiert lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. Beim Lesen ( unix.stackexchange.com/questions/171519/… ) scheint es, dass selbst root nicht darauf zugreifen kann. Was wäre die Alternative zu lsof -p1 | grep deleted?
Motivierter
2

In meinem Fall hatte ich gerade ein Upgrade durchgeführt systemdund ein systemctlBefehl schlug fehl:

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

Der initManpage zufolge können Sie jedoch dasselbe tun, indem Sie SIGTERMan den Dämon senden , der als PID 1 ausgeführt wird. Dies hat funktioniert:

kill -TERM 1

Dadurch wurde der Dämon neu geladen, wonach alle systemctlBefehle wieder funktionierten.

Bösartig
quelle