我见过很多软件,例如 Update Manager 和 Synaptic Package Manager,它们会等待其他程序正在使用/var/lib/dpkg/lock
并且被锁定。我们如何通过终端做到这一点?我看到了apt-get
手册,但没有发现任何有用的东西。
Rad*_*anu 51
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 "$@"
Run Code Online (Sandbox Code Playgroud)
不要忘记使其可执行:
sudo chmod +x /usr/local/sbin/apt-get
Run Code Online (Sandbox Code Playgroud)
在测试之前,请检查是否一切正常。which apt-get
命令的输出应该是 now /usr/local/sbin/apt-get
。原因是:默认情况下,目录位于 user 或 root 中的/usr/local/sbin
目录之前。/usr/bin
PATH
Jor*_*tro 38
您可以使用的aptdcon
命令 通过与 aptdaemon 通信而不是直接使用 apt-get 来排队包管理器任务。
所以基本上你可以做sudo aptdcon --install chromium-browser
任何事情,当该命令正在运行时,你可以再次运行它,但安装不同的软件包,apt-daemon 只会将它们排入队列而不是出错。
如果您正在进行长时间的升级或其他事情并希望继续安装软件包,或者您正在编写脚本并希望确保安装内容更可靠,这将特别有用。
Oli*_*Oli 26
一个非常简单的方法是编写一个等待锁未打开的脚本。让我们调用它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
Run Code Online (Sandbox Code Playgroud)
然后就跑sudo waitforapt && sudo apt-get install whatever
。您可以将例外添加sudoers
到允许您在不需要密码的情况下运行它(您将需要它,apt-get
所以它没有什么好处)。
不幸的是,这不会排队。鉴于 apt 的某些操作是交互式的(“您确定要删除所有这些包吗?!”),我看不出有什么好的方法可以解决这个问题...
Bra*_*iam 21
除了显而易见的&&
,您可能正在寻找aptdcon
. 该工具能够检测 apt 的其他实例并等待它们完成:
须藤 aptdcon --safe-upgrade [/] 11%等待其他软件经理退出Waiting for aptitude
(我正在其他地方运行 aptitude)
此工具的优点是您可以连续存储多个操作,而不必担心接下来要做什么。aptdcon
是无人值守脚本和 GUI 安装的理想选择,因为您可以允许该工具在后台运行而不会阻塞您的前端。
支持的操作aptdcon
有:
--refresh
, -c
: 这相当于apt-get update
。它会更新您的包裹清单。--install
, --remove
, --upgrade
, --purge
, --downgrade
. 他们每个人都像他们的名字所说的那样做。包的名称是强制性的。-i
, -r
, -u
, -p
: 这些是除降级之外的所有人的简短选项,谁没有。--safe-upgrade
,--full-upgrade
是apt-get
's upgrade
/dist-upgrade
和aptitude
's safe-upgrade
/的对应物full-upgrade
。这些不需要参数。aptd
. 有些选项与 what apt-key
、apt-cache
、dpkg
do重叠。apt-get
本身不支持这样的方法(等待 apt 的其他实例),因此aptdcon
是 GUI 包管理器的首选解决方案:USCaptd
用作后端,与 Synaptic 相同。其他解决方案是packagekit
,但它不支持您正在寻找的功能(还)。
从 1.9.11 开始apt
,apt-get
有一个选项可以让您等待 dpkg 锁被释放。
使用该DPkg::Lock::Timeout
选项为 apt-get 命令设置超时(以秒为单位)。此示例将等待 60 秒:
sudo apt-get -o DPkg::Lock::Timeout=60 install packagename
Run Code Online (Sandbox Code Playgroud)
如果将该值设置为 -1,它将永远等待。
sudo apt-get -o DPkg::Lock::Timeout=-1 install packagename
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅:在没有 hacky bash 脚本的情况下等待 apt 锁。该选项于 2020 年 2 月添加到 apt-get 中。