我见过许多软件,例如 Update Manager 和 Synaptic Package Manager,如果其他程序正在使用/var/lib/dpkg/lock
并且被锁定,它们会等待。我们如何通过终端执行此操作?我看了apt-get
手册,但没有找到任何有用的东西。
答案1
您可以apt-get
学习如何等待另一个软件管理器是否正在运行。与下一个屏幕截图中的行为类似:
我是如何做到的?
apt-get
我在目录中创建了一个名为(wrapper for apt-get
)的新脚本,/usr/local/sbin
其中包含以下 bash 代码:
#!/bin/bash
i=0
tput sc
while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
case $(($i % 4)) in
0 ) j="-" ;;
1 ) j="\\" ;;
2 ) j="|" ;;
3 ) j="/" ;;
esac
tput rc
echo -en "\r[$j] Waiting for other software managers to finish..."
sleep 0.5
((i=i+1))
done
/usr/bin/apt-get "$@"
不要忘记使其可执行:
sudo chmod +x /usr/local/sbin/apt-get
测试之前,先检查一切是否正常。命令的输出which apt-get
应该是 now /usr/local/sbin/apt-get
。原因是:默认情况下,/usr/local/sbin
目录位于/usr/bin
user 或 root 目录之前PATH
。
答案2
您可以使用命令aptdcon
通过与 aptdaemon 通信而不是直接使用 apt-get 来排队包管理器任务。
因此基本上您只需执行sudo aptdcon --install chromium-browser
其他操作即可,当该命令运行时,您可以再次运行它,但安装不同的包,而 apt-daemon 只会将它们排队而不是出错。
如果您正在进行长期升级或其他操作并想要继续安装软件包,或者您正在编写脚本并想要确保安装内容更加可靠,这尤其有用。
答案3
一种非常简单的方法是编写一个等待锁未打开的脚本。让我们调用它waitforapt
并将其粘贴进去/usr/local/bin
:
#!/bin/sh
while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do
sleep 1
done
然后只需运行sudo waitforapt && sudo apt-get install whatever
。您可以添加例外,sudoers
以允许您在不需要密码的情况下运行它(您将需要它,所以apt-get
这没什么大不了的)。
不幸的是,这不会对事物进行排队。鉴于 apt 的某些操作是交互式的(“您确定要删除所有这些包吗?!”),我看不出有什么好办法可以解决这个问题……
答案4
自 1.9.11 以来apt
,apt-get
有一个选项可让您等待 dpkg 锁被释放。
使用该DPkg::Lock::Timeout
选项设置 apt-get 命令的超时时间(以秒为单位)。此示例将等待 60 秒:
sudo apt-get -o DPkg::Lock::Timeout=60 install packagename
如果将该值设置为 -1,它将永远等待。
sudo apt-get -o DPkg::Lock::Timeout=-1 install packagename
更多信息请参阅:不使用 hacked bash 脚本来等待 apt 锁. 这个选项是2020 年 2 月添加到 apt-get。