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

데비안 기반 배포판에서도 비슷합니다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 }}"

관련 정보