如何让 needrestart 不推迟重启某些服务

如何让 needrestart 不推迟重启某些服务

unattended-upgrades适当设置自动进行升级、重启等操作后,我有时会在每日报告中发现这样的输出:

...
Restarting services...
 /etc/needrestart/restart.d/systemd-manager
 systemctl restart accounts-daemon.service networkd-dispatcher.service polkit.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service

Service restarts being deferred
 systemctl restart apt-daily-upgrade.service
 systemctl restart systemd-journald.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service
...

我知道这是输出needrestart。我不明白是什么设置了服务除了不重新启动的之外,其他的都会重新启动。我需要更改哪些配置才能使其重新启动全部这些服务无人值守吗?

答案1

软件包needrestart维护着一个不应在 中自动重新启动的服务排除列表/etc/needrestart/needrestart.conf。查找$nrconf{override_rc}设置。

修改此列表时请小心谨慎。根据我的快速浏览,似乎大多数这些默认排除项都是由于用户报告的重新启动服务时出现的问题而导致的。该文件中的许多排除项都有一条注释,其中包含 Debian 错误跟踪器编号,解释了排除项存在的原因。

查看问题中的示例,这些排除导致您的服务无法自动重新启动:

  • apt-daily-upgrade.service并且unattended-upgrades.service不会重新启动,因为needrestart如果这些服务启动了正在运行的进程,则重新启动它们可能会终止该进程。这记录在 bug 中#862840
  • systemd-journald.service无法重新启动,因为它会破坏许多其他服务。这已记录在 bug 中#771122。但是,这个问题已经存在 2 年了,而且这种排除在较新版本 (3.4+) 中不存在needrestart。在我的 Ubuntu 22.04 系统上它没有被排除。
  • systemd-logind.service不会重新启动,因为重新启动会终止正在运行的 X 服务器会话。这记录在 bug#798097

答案2

我创建了这个 cronjob,以确保机器在需要时重新启动:

#!/bin/bash
NEEDRESTART=$(needrestart -v)
STRINGTOSEARCH="Service restarts being deferred"

if [[ "$NEEDRESTART" =~ "$STRINGTOSEARCH" ]]
then
        reboot
fi

相关内容