명령이 반환되기 전에 무인 업그레이드를 종료하고 비활성화/제거합니다.

명령이 반환되기 전에 무인 업그레이드를 종료하고 비활성화/제거합니다.

여기서 문제가 발생했습니다. Ansible을 사용하여 설정을 자동화하려고 합니다.

일부 단계에서는 상호 작용이 필요 apt하지만 무인 업그레이드가 시작되고 잠겼기 때문에 오류가 발생하는 경우가 있습니다. 이렇게 하면 스크립트가 중단됩니다.

이 문제를 해결하기 위해 여러 가지 방법을 시도했는데 가장 성공적인 방법은 실패한 apt 명령을 반복하는 것입니다.

하지만 이는 확장되지 않고, 100% 신뢰할 수 없으며, 기분이 좋지 않습니다.

나는 apt -y purge unattended-upgrades스크립트 시작 부분에서 권리를 발행하기로 결정했습니다. 나도 시도해 봤는데 apt -y remove unattended-upgrades그 사람은 아직 일하다가 다시 돌아온 것 같아요. 지우기는 종료하기 전과 마찬가지로 무인 업그레이드를 끄는 것 같습니다. 이것이 제가 원하는 것입니다.

apt -y purge unattended-upgrades그러나 잠금으로 인해 호출도 실패할 수 있음이 밝혀졌습니다 . 그래서 로 변경했는데 while [[ $(dpkg -l | grep -P "unattended-upgrades" | wc -c) -ne 0 ]]; do apt -y purge unattended-upgrades; done가끔 실패하기도 합니다(이유는 모르겠습니다).

실행 시 자동 업그레이드가 실행 중이든 아니든 즉시 종료하고 묻어버리고 명령이 반환된 후 다시 지울 때까지 다시 시작되지 않도록 보장하는 명령이 필요합니다 apt install.명령이 작업을 완료하는 데 1분 정도 걸리더라도 괜찮습니다.

또한 시스템에는 Python이 설치되어 있지 않으므로 Ansible은 raw호출이 성공한 후에 Python을 설치할 때까지만 명령을 실행합니다.apt -y update

date -s가상머신이라 쉽게 무인 업그레이드를 할 수 있는 상태인데, 오래된 날짜를 수정하라는 명령을 내리자마자 무인 업그레이드가 시작됩니다. VM을 시작한 후 date자동 수정이 수행되고 무인 업그레이드가 시작될 때까지 몇 분 정도 시간이 걸립니다 .

이것이 내가 지금 하고 있는 일입니다:

- name: Disable autoupdate (part 1 of 2)
  raw: sed -i /Update/s/"1"/"0"/ /etc/apt/apt.conf.d/10periodic && sync

- name: Disable autoupdate (part 2 of 2)
  raw: echo 'APT::Periodic::Unattended-Upgrade "0";' >> /etc/apt/apt.conf.d/10periodic && sync

- name: Terminate any active autoupdate
  raw: ps -A | grep unattended-upgrades | awk '{print $1}' | xargs -r kill -15 $1

- name: Terminate any active dpkg
  raw: ps -A | grep dpkg | awk '{print $1}' | xargs -r kill -15 $1

- name: Allow dpkg to recover
  raw: dpkg --configure -a

- name: Purge autoupdate
  raw: apt -y purge unattended-upgrades    

- name: Update apt cache
  raw: apt -y update

- name: If needed, install Python
  raw: test -e /usr/bin/python || apt -y install python

dpkg를 종료하면 겁이 납니다. 모두 Ubuntu Server 18.04.1을 새로 설치하여 실행 중입니다.


허용된 답변을 사용하여 생성된 솔루션은 다음과 같습니다.

https://stackoverflow.com/a/51919678/277267

답변1

분명히 unattended-upgrades시스템 장치 apt-daily.service / apt-daily-upgrade.service 중 하나에서 실행되고 있습니다. (이는 .timer동일한 이름을 가진 시스템 장치에 의해 차례로 트리거됩니다 .)

다음과 같이 systemd 장치를 기다려볼 수 있습니다.

systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true

dpkgSIGTERM을 보내려는지 또는 apt-get더 빨리 완료하기 위해 무언가를 보낼지 여부에 관한 것이 아닙니다. kill이는 신호를 전송하기만 하며 아무것도 기다리지 않습니다. 원칙적으로 릴리스된 리소스를 사용하려면 항상 어떤 방식으로든 기다려야 합니다.

관련 정보