如何在系统关闭期间安装更新?

如何在系统关闭期间安装更新?

这个问题适用于 RedHat 7、8、9(及其衍生版本)以及 Ubuntu 20.04 和 22.04(全部基于 systemd)。我的猜测是所有人的答案都是相似的,但我发现它们并不相同。

我想“挂钩”系统关闭顺序以便安装更新。我的想法是,由于重新启动的维护窗口很难获得,并且管理员有时会忘记在重新启动之前安装更新,因此我希望这种情况自动发生。

我也希望这种情况发生,无论关闭是如何或为何启动的,无论是使用 shutdown -r、shutdown -h、systemctl restart 还是任何其他方法。

使用 systemd 挂接到关闭序列的总体轮廓非常简单:

# This service is will watch for a clean shutdown, and install updates etc.
# before the actual shutdown.

# Credit goes to https://opensource.com/life/16/11/running-commands-shutdown-linux

[Unit]
Description=Run package updates at shutdown
#------------ Ubuntu version ------------
Requires=network.target
BindsTo=network.target multi-user.target systemd-resolved.service rsyslog.service
After=network.target multi-user.target systemd-resolved.service rsyslog.service
#------------ RedHat version ------------
Requires=network.target
BindsTo=network.target multi-user.target boot.mount rsyslog.service
After=network.target multi-user.target boot.mount rsyslog.service
#------------- End distro specific ---------
DefaultDependencies=no
Before=shutdown.target reboot.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=update_script.sh
# Allow enough time to complete an update. Default would be 90 seconds
TimeoutStopSec=3600

[Install]
WantedBy=multi-user.target

update_script.sh 执行以下操作:

systemstatus=$(systemctl is-system-running)
case "$systemstatus" in
 stopping)
   <do updates>
   ;;
 *)
   # Unknown state, don't do updates
   # This prevents updates when starting/stopping the service manually.
   ;;
esac

这里的问题是,更新发生在进程已经部分关闭的情况下。因此,某些更新无法正确安装。

但是,当我将脚本放在关闭序列中过早时,systemctl is-system-running 报告“正在运行”而不是“正在关闭” - 在这种情况下,脚本认为该服务只是手动停止,并且不执行更新。

我需要的是:

  • 在关闭序列的任何其他部分之前首先运行此服务的方法。
  • 一种防止 systemd 同时关闭任何其他服务的方法。
  • 这是一种即使在系统处于关闭过程的早期阶段(在“systemd is-system-running”正确报告之前)也能可靠检测到的方法。

或者,我需要一些其他(干净的、非黑客的)方法来在其他任何东西关闭之前连接到系统关闭。

注意:我还尝试过在启动阶段而不是关闭阶段进行更新。但这可能需要第二次重新启动,所以这是不可取的。

相关内容