如果您在终端上运行apt-get
命令并想在软件中心安装东西,该中心会说它会等到apt-get
完成。我想知道是否可以在终端上执行相同的操作,即apt-get
在终端上等待直到锁被释放。
我发现这个链接,用于aptdcon
安装东西。我想知道是否:
- 难道真的不能用吗
apt-get
? aptdcon
与 兼容,apt-get
即我可以使用两者来安装东西而不破坏系统吗?
答案1
apt
11.9.1
这已解决Debian 错误 #754103在这次提交。该修复适用于 1.9.11 更新的 apt 版本。
- apt(8):等待锁定(关闭:#754103)
您可以通过设置为或 的-o DPkg::Lock::Timeout=60
参数来启用此选项。哪里有等待锁的时间(以秒为单位)。apt
apt-get
60
apt -o DPkg::Lock::Timeout=60 install FOO
apt-get -o DPkg::Lock::Timeout=60 install FOO
您可以通过运行两个相同的命令来测试这一点,并且只是不立即回答第一个命令Do you want to continue? [Y/n]
?在您运行的第二个命令中,它会告诉您,
等待缓存锁:无法获取锁
/var/lib/dpkg/lock-frontend
。它由进程 946299 (apt) 持有
答案2
(重贴自询问 ubuntu)
现在有一个内置选项apt-get
可以让您等待另一个 apt 完成。
使用该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
欲了解更多信息,请参阅:等待 apt 锁定,无需使用 hacky bash 脚本。这个选项是apt-get
2020 年 2 月添加。
答案3
你已经可以这样做了:
创建一个名为 apt-get (apt-get 的包装)的新脚本
/usr/local/sbin
目录中包含以下 bash 代码:
#!/bin/bash
#Make sure there is no space before the hashbang above!
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
运行。使用 synaptic 或另一个 apt-get 打开再次运行它。 ;)
/usr/local/sbin
在路径中较早出现...
我认为这可能会导致某个地方的脚本混乱......也许?
答案4
对于使用旧版本(< 1.9.11)的人来说,上述方法可能不起作用,所以这是我的解决方案的 hacky 版本。
#!/bin/bash
timeout=12
wait_time=5
counter=0
while (( counter < timeout )); do
if sudo apt install jq -y 2>/dev/null; then
echo "jq installed successfully."
exit 0
else
echo "Installation failed. Waiting for other software managers to finish..."
sleep $wait_time
((counter++))
fi
done
echo "Could not install jq within $((timeout * wait_time)) seconds. Skipping installation."
这也是一个缩小版本
for i in {1..12}; do sudo apt install jq -y && exit 0 || sleep 5; done