在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