この質問は、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」が正しく報告される前)にも確実に検出する方法です。
または、他のシステムがシャットダウンする前にシャットダウンに接続できる他の(クリーンでハッキングされていない)方法が必要です。
注:また、終了フェーズではなくスタートフェーズで更新を試みました。ただし、この場合は2回目の再起動が必要になる可能性があるため、お勧めできません。