我可以在不重新启动的情况下重新启动systemd吗?


39

yum update在RHEL 7.4上尝试重新启动服务。我可以使用systemctl重新启动每个服务,但是needs-restartingyum utils告诉我,我也应该重新启动systemd本身:

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

我可以在systemd不重新启动服务器的情况下重新启动吗?

我发现了一些提及systemctl daemon-reload,但这并没有使它从重新启动需求列表中消失。

Answers:


43

要重新启动守护程序,请运行

systemctl daemon-reexec

这是记录在systemctl手册页

重新执行systemd管理器。这将序列化管理器状态,重新执行该过程,然后再次反序列化该状态。除了调试和软件包升级以外,此命令几乎没有用。有时,作为重量级人物可能会有所帮助daemon-reload。重新执行守护程序时,代表用户配置侦听的所有套接字systemd都将保持可访问状态。

不幸的是needs-restarting无法确定是否systemd已真正重启。systemd execs自己重新启动,这不会重置进程的开始时间;但是needs-restarting将可执行文件的修改时间与进程的启动时间进行比较,以确定是否需要重启进程(以及其他原因),因此,它始终认为systemd需要重启...要确定是否systemd真的需要重启,您可以检查的输出lsof -p1 | grep deletedsystemd使用一个库,libsystemd-shared该库与同一软件包一起提供,并与守护程序一起升级,因此,如果systemd需要重新启动,您会使用库的已删除版本看到它。如果未lsof显示删除的文件,systemd则无需重新启动。(谢谢Jeff Schaller的提示!)


1
@Raman,daemon-reexec应该工作,即使systemd是PID 1
斯蒂芬·基特

3
重新启动需求的症结归结于github.com/rpm-software-management/yum/blob/master/…那里,它查询PID的“ start_time”。如果守护程序重新执行未更新,则需要重新启动将保持“混乱”状态。
Jeff Schaller

1
不要以为所涉及的任何代码路径都经过了良好的测试,尤其是在非RedHat系统上。从技术上讲,可以运行daemon-reexec,但重新启动会更安全。
哈拉尔德

2
@Harald任何人systemd在Debian及其衍生产品上进行升级时都会使用它,因此它已经过了充分的测试。它也相当简单明了(请查找do_reexecute)。
斯蒂芬·基特

1
@StephenKitt-当我尝试运行时,lsof -p1 | grep deleted将生成以下输出lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete。在阅读(unix.stackexchange.com/questions/171519/…)时,即使root用户也无法访问它。替代方案是lsof -p1 | grep deleted什么?
动机

2

就我而言,我刚刚升级systemd,所有systemctl命令都失败了:

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

但是,根据手册init页,您可以通过发送SIGTERM给以PID 1运行的守护程序来执行相同的操作,该守护程序可以正常工作:

kill -TERM 1

这将重新加载守护程序,之后所有systemctl命令将再次开始工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.