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 魔法来比较这两个字符串(然后.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