这个问题是关于RedHat 7/8/9 的。
应用大多数更新后,重新启动受影响的服务就足够了。
RedHat 提供了跟踪器工具来准确识别需要重新启动的内容。它产生类似于以下内容的输出:
You should restart:
* Some applications using:
systemctl restart chronyd
systemctl restart firewalld
systemctl restart mariadb
systemctl restart polkit
systemctl restart postfix
systemctl restart rngd
systemctl restart rsyslog
systemctl restart sshd
systemctl restart sssd
systemctl restart systemd-journald
systemctl restart systemd-logind
systemctl restart systemd-udevd
systemctl restart tuned
systemctl restart vmtoolsd
* These applications rebooting your computer:
dbus
kernel
systemd
我的理解是,只有内核更新(没有 ksplice)才需要重新启动。
如何在不重新启动的情况下重新启动 systemd 和 dbus?
我已经尝试过了
systemctl 守护进程重新执行
重新启动 PID-1 进程。
但在 tracer -a 之后仍然报告 systemd“需要重新启动计算机”。
对于 dbus,我什至不知道从哪里开始寻找。
答案1
systemctl daemon-reexec
是重新启动systemd的命令。但请记住,PID 1 并不是 systemd 的唯一实例 - 每个具有交互式登录会话的用户也有自己的每用户实例,他们可以使用 重新启动该实例systemctl --user daemon-reexec
。 (这些实例被管理为user@*.service
;相关术语:“linger”。)
确实如此技术上dbus-daemon 无需重新启动即可重新启动,因为它只是一个用户空间服务,由 systemd 作为 进行管理dbus.service
。但实际上,并不真正建议这样做,因为这样做可能会导致许多其他服务由于失去与其 IPC 总线的连接而意外退出。
保持旧版本的 dbus-daemon 运行通常是安全的,因为它不会动态加载任何其他库或模块(它需要的所有内容都由 ld.so 在启动时加载)。相比之下,httpd做动态加载模块,这就是它在这些情况下崩溃的原因。
答案2
这通常应该是一条评论,用于详细说明 @user1686 的出色答案。我将其作为一个完整的答案,以便能够从 URL 复制一些相关注释。
看到@user1686的回答后,我还发现了这个:https://access.redhat.com/solutions/27943
这是需要重新启动的软件包的完整列表(可能会发生变化)。该列表适用于 RHEL 5/6/7,但在 RHEL 8 和 9 中可能类似。
kernel
kernel-PAE
kernel-rt
kernel-smp
kernel-xen
linux-firmware
*-firmware-*
dbus
glibc
hal
systemd
udev
gnutls
openssl-libs
还:
这并不意味着严格要求在更新这些软件包后立即重新启动系统。
通常,在应用非安全 glibc 勘误后重新启动服务就足够了
该文章提供了更多详细信息,这些详细信息都相当于“您应该重新启动任何依赖于已更新内容的服务”。当然,这几乎是每一项服务。
因此:如果内核未更新,您确实可以避免重新启动,但您将不得不重新启动几乎所有服务。
还可以在 RHEL 7.7 及更高版本、8.1 及更高版本以及 RHEL 9 中使用 kpatch 来更新内核本身,而无需重新启动。
详细信息在这里:https://www.redhat.com/sysadmin/kernel-live-patching-linux
RHEL 7、RHEL 8 和 RHEL 9 的说明有所不同。对于 RHEL 8 和 9:
dnf install kpatch kpatch-dnf
dnf kpatch auto