我在这里遇到一个问题,我尝试使用 Ansible 自动化设置。
有些步骤需要与 进行交互apt
,但有时我会收到错误,因为无人值守升级已启动并锁定了 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
再次明确它。如果该命令需要一分钟才能完成其工作,那也没关系。
另外,系统没有安装 Python,因此 Ansible 仅发出raw
命令,直到我设法安装 Python,这应该是在成功调用之后apt -y update
我处于可以轻松触发无人值守升级的状态,因为这是一个虚拟机,一旦我发出命令date -s
来更正过时的日期,无人值守升级就会启动。启动虚拟机后,我有几分钟的时间直到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 上运行
这是使用已接受的答案创建的解决方案:
答案1
显然unattended-upgrades
是从 systemd 单元 apt-daily.service / apt-daily-upgrade.service 之一运行的。 (这些依次由.timer
具有相同名称的 systemd 单元触发)。
您可以尝试按如下方式等待 systemd 单元:
systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true
dpkg
这与您是否想要发送 SIGTERM或apt-get
尝试让它们更快完成的东西无关。kill
只传输信号;它不等待任何事情。原则上,您总是需要某种方式等待,然后才能使用释放的资源。