请注意:还有类似的问题,但这个特定场景没有答案。不要将其作为 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 的另一个实例正在运行,如何让包管理器等待?