久しぶりにログインすると、未適用の修正がたくさんあって毎度手打ちで修正適用して必要に応じてリブートとかめんどくさくなってきたので楽したいというお話。
前提環境
/etc$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.1 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy
やりたいこと
- apt updateとapt upgrade -yの2つのコマンドを実行する
- リブートの必要があればrebootコマンドを実行する
- 夜中に勝手に全てを済ませてくれる。
コマンドの投入がメインなのでshellスクリプトで充分かなと思います。
夜中に動く部分はcronにお任せすることにします。
作成したshellスクリプト
#!/usr/bin/sh /usr/bin/apt update /usr/bin/apt upgrade -y if [ "`/etc/update-motd.d/98-reboot-required`" = "*** System restart required ***" ]; then /usr/sbin/reboot fi
以下、メモ
悩みポイントは2つ。
- リブートが必要なことをどうやって調べるか
- Ubuntu 22.04でapt upgradeしたときに問い合わせ画面が出てきて止まってしまう問題
リブートが必要なことを調べる方法
そもそもこういう作りにしようと思ったきっかけですが、Ubuntuにsshでログインすると未適用のパッチがいくつあってとか、リブートが必要とか、色々表示されるのですよね。
リブートが必要かどうかコマンドでわかるなら、それで判定して必要なときにだけリブートできそうだよねと思いまして。
Ubuntuの場合は/etc/update-motd.d
の仕組みでログインのときのメッセージを表示している模様。
実際にディレクトリの中を見てみます。
~$ cd /etc/update-motd.d/ /etc/update-motd.d$ ls 00-header 88-esm-announce 95-hwe-eol 10-help-text 90-updates-available 97-overlayroot 50-landscape-sysinfo 91-contract-ua-esm-status 98-fsck-at-reboot 50-motd-news 91-release-upgrade 98-reboot-required 85-fwupd 92-unattended-upgrades /etc/update-motd.d$
sshでログインするときには、これらがすべて実行されるということのようです。
知りたいのはリブートが必要かどうかを表示する部分。名前的に怪しいのは98-reboot-required
ですかね。実際に手打ちで実行してみます。
/etc/update-motd.d$ ./98-reboot-required
\*\*\* System restart required \*\*\*
/etc/update-motd.d$
実際にリブートが必要な状態で実行すれば、このように「System restart required」と表示されます。
あとはこれをshellスクリプトの中で実行して、表示された結果が「System restart required」かどうかを調べて、一致するときはreboot
コマンドを投入すればいいわけです。
if [ "`/etc/update-motd.d/98-reboot-required`" = "*** System restart required ***" ]; then /usr/sbin/reboot fi
shellスクリプトの中でバッククォートで囲まれた部分は、その中身を実行して表示される内容をそのままスクリプトの中に展開してくれます。それを文字列比較して判定することができました。
apt upgradeで問い合わせ画面が出てきて処理が止まる問題
apt upgradeコマンドを実行したとき、紫色の画面が表示されて入力待ちになることがあります。これの正体について調べました。
needrestartというパッケージがUbuntu22.04から採用されているようで、こいつのせいらしいです。
マシンの利用形態にもよるんでしょうけど、今回は普段から決まった時間にパッチ当てて勝手にリブートして欲しいので、そのように設定します。
needrestartの設定ファイルは、/etc/needrestart/needrestart.conf
にありました。
$nrconf{restart} = 'a';
これで入力待ちで止まるようなことは無くなりました。