如何判断Ubuntu系统是否需要重启?

如何判断Ubuntu系统是否需要重启?

我最近使用 ansible 应用了一个内核补丁(debian 10 和 Ubuntu 18.04 的混合)。我正在尝试找出一种方法来检查每台正在更新的计算机是否已经或需要重新启动。我读过这test -f /var/run/reboot-required是官方指标,但我注意到这并不总是正确的。有时该文件在内核升级后存在,有时则不存在。我没有使用 LivePatch,因此每当有内核更新时,我都需要安排所有这些系统的重新启动。

在 ansible 中,测试上面的文件是否存在非常简单,但由于这不一致,我想出了下面的 bash 代码来根据/boot.这并不是你不需要大量锤炼就可以直接插入 ansible 中的东西。

有没有更好的方法来确定是否需要重新启动?

if [[ $(uname -r) != .*"$(ls -1 /boot/vmlinuz* | sort -V | tail -1)"*. ]]; then
   echo "Needs reboot. Running kernel $(uname -r) is older than $(ls -1 /boot/vmlinuz* | sort -u | tail -1)"
fi

答案1

不仅在安装新内核后可能需要重新启动,而且在更新微码、glibc、SSL 库等后也可能需要重新启动。因此,更多事件将需要重新启动。

在 RHEL 中,有一些基于可用包管理器的实用程序,yum-utils其中包含一个needs-restarting脚本,用于查询在应用更新后是否有必要执行此操作。

在基于 Debian 的发行版中是类似的needrestart可用,其中检查更新后是否需要重启

例子(基于RHEL 7)

解决依赖关系后

- name: Install basic admin tools
  yum:
    name: yum-utils
    state: latest

检查很简单

- name: Check if reboot_required
  shell:
    cmd: "needs-restarting -r"
  changed_when: false
  failed_when: reboot_required.rc != 0 and reboot_required.rc != 1
  check_mode: false
  register: reboot_required

- name: Report reboot_required
  debug:
    msg: "{{  reboot_required.rc | bool }} "
  changed_when: reboot_required.rc == 1
  check_mode: false

并产生输出

TASK [Report reboot_required] **************************************************
ok: [test1.example.com] => {
    "msg": "True "
}
ok: [test2.example.com] => {
    "msg": "False "
}

您可能需要更改依赖关系解析部分,以及根据man needrestart

答案2

这是我的解决方案,以防对其他人有用。

---
- hosts: all

  vars:
    kernel_version: "{{ ansible_kernel }}"

  tasks:

    # sort -V specifically sorts software versions :)
    - name: find newest kernel under /boot
      shell   : ls -1 /boot/vmlinuz* | sort -V | tail -1
      register: latest_kernel

    # running kernel does not match latest kernel - can't do <> comparison since text is involved
    - name: test kernel versions different
      when: kernel_version not in latest_kernel.stdout
      debug:
        msg: "WARNING: needs reboot - running kernel {{ kernel_version }} was not found in variable {{ latest_kernel.stdout }}"

相关内容