unattended-upgrades
カーネルを含むUbuntuセキュリティ更新プログラムは自動的にインストールされますが、自動再起動はありません(大丈夫です。自動再起動は不要または不要です)。
次のような場合はどうすればわかりますかthe running kernel = the latest installed kernel
?
以下を使用して現在のカーネルバージョンを取得できます。
$ uname -r
5.4.0-104-generic
最新のインストールされたカーネルは、以下を介して見つけることができます。
$ dpkg -s linux-image-generic | awk '/Version:/{print $2}'
5.4.0.104.108
どちらも一致しません。 bashマジックを使用して2つの文字列を比較することはできますが(.108
続けるべき理由は何ですか?)、標準アイテムを使用することを好みます。
答え1
以下は、私が使用しているものとは異なるディストリビューションで動作する必要があります。
#!/usr/bin/env bash
HIGHEST_KERNEL=`find /boot/vmlinuz-* | sort -V | tail -n 1 | sed 's|.*vmlinuz-||'`
RUNNING_KERNEL=`uname -r`
echo "Highest Kernel: $HIGHEST_KERNEL | Running Kernel: $RUNNING_KERNEL"
if [ "$HIGHEST_KERNEL" != "$RUNNING_KERNEL" ]; then
echo "** Reboot Required **"
exit 1
fi
答え2
この場合、システムが常に最新のカーネルを起動すると仮定すると、起動時間をカーネルイメージのタイムスタンプと比較します。最も簡単な方法は/proc/1
プロキシを使用することです。
find /boot -newer /proc/1 -name vmlinuz\*
リストにエントリがある場合は、システムを再起動する必要があります(適切なシステムを使用して実行できます-exec
)。
パッケージ化されたカーネルのみを使用している場合は、そのカーネルがあるかどうかを確認することもできます。/run/reboot-required
存在する場合は再起動する必要があります。/run/reboot-required.pkgs
再起動を要求するパッケージがリストされます。
needrestart
同じ名前のパッケージを使用することもできます。
needrestart -k
答え3
何らかの理由でUbuntuでは非常に難しくなります。以下の回答は(!)Ubuntu 20.04 LTSにのみ適用され、他のバージョンでは動作する場合と動作しない場合があります。
したがって、質問で述べたように、次の方法で最新のインストール済みカーネルを取得できます。
$ version_installed=`dpkg -s linux-image-generic | awk '/Version:/{print $2}'`
$ echo "$version_installed"
5.4.0.104.108
最後の数字は#108
関連性がないように見えるので切り取ります。
$ version_installed=`dpkg -s linux-image-generic | awk '/Version:/{print $2}'` | awk -F . '{print $1"."$2"."$3"."$4}'` # this can be improved but I'm too lazy
$ echo "$version_installed"
5.4.0.104
uname -r
不要なビットを含むバージョンが提供されます5.4.0-104-generic
。問題を解決しましょう。
$ version_running=`uname -r | sed 's/-generic//;s/-/\./;` # could be simplified as well
$ echo "$version_running"
5.4.0.104
今私たちはできる
#! /bin/bash
version_installed=`dpkg -s linux-image-generic | awk '/Version:/{print $2}' | awk -F . '{print $1"."$2"."$3"."$4}'`
version_running=`uname -r | sed 's/-generic//;s/-/\./'`
if [ "$version_installed" = "$version_running" ]; then
echo "All Good"
else
echo "Life is a misery"
fi