如何在无人值守执行时等待 /var/lib/apt/lists/lock 可用性?

如何在无人值守执行时等待 /var/lib/apt/lists/lock 可用性?

请注意:还有类似的问题,但这个特定场景没有答案。不要将其作为 335794 或 1340943 的重复项关闭。

这总是可以重现的,这是关于apt 列表锁定与 dpkg 锁无关。

我正在运行一系列通过 APT 执行安装的自动化任务。这些任务是连续的(零并行性),但可能会多次调用 apt。在某个时候,当脚本执行时

sudo apt -o DPkg::Lock::Timeout=60 update

我立即得到此错误输出:

Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock. It is held by process 1496 (packagekitd)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/lib/apt/lists/

这个错误很快就消失了- 如果我在 10 秒后重试,操作(通常)会成功,但有时它会保持锁定状态更长时间,因为 packagekitd 正在做什么谁知道。

我的问题:这是一个无人值守的操作。我希望实现自动化,但我找不到以下方法:

  • 告诉 apt 等待列表锁可用,或者
  • 手动等待锁定 - 我尝试使用即使有独占锁,但获取它似乎总是成功(它可能使用了另一种锁定方法)

当然我每次都可以睡觉。但这很不稳定,会让进程变得很慢。

操作系统:Ubuntu 22.04 Intel 64位

答案1

#!/bin/sh

while sudo fuser /var/lib/apt/lists/lock >/dev/null 2>&1; do
   sleep 1
done

这招奏效了。来自如果 APT 的另一个实例正在运行,如何让包管理器等待?

相关内容