首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在命令返回之前终止并禁用/删除无人值守的升级

在命令返回之前终止并禁用/删除无人值守的升级
EN

Unix & Linux用户
提问于 2018-08-19 13:19:23
回答 1查看 17.5K关注 0票数 8

我在这里遇到了一个问题,我试图用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命令,直到我成功地调用apt -y update之后才能安装Python

我处于这样一种状态,我可以很容易地触发无人值守的升级,因为这是一个VM,一旦我发出一个date -s命令来纠正陈旧的日期,无人值守的升级就会启动。启动VM后,我有几分钟的时间,直到date自动校正自身,然后开始无人值守的升级。

这就是我现在要做的:

代码语言:javascript
复制
- 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。所有这些都是在UbuntuServer18.04.1的新安装上运行的。

Here是通过使用可接受的答案:创建的解决方案

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

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-08-19 13:38:19

显然,unattended-upgrades是由一个系统单元apt-daily.service /apt-日升级服务运行的。(这些都是由具有相同名称的systemd .timer单元触发的)。

您可以尝试等待系统单元,如下所示:

代码语言:javascript
复制
systemd-run --property="After=apt-daily.service apt-daily-upgrade.service" --wait /bin/true

这与您是否希望将SIGTERM发送到dpkgapt-get或其他试图让它们更快完成的事情无关。kill只发送一个信号;它不等待任何东西。原则上,在使用释放的资源之前,您总是需要某种方式等待。

票数 12
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/463498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档