如果 APT 的另一个实例正在运行,如何让包管理器等待?

如果 APT 的另一个实例正在运行,如何让包管理器等待?

我见过许多软件,例如 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/binuser 或 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 以来aptapt-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

相关内容