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

Piy*_*ush 63 command-line apt

我见过很多软件,例如 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/binPATH

  • 那很完美!我在使用 AWS cloudinit 在新服务器上安装软件包时遇到了问题,但 Ubuntu 在启动时做了一些 `apt` 操作,所以我的 `dpkg` 命令由于 dpkg db 锁定而失败。我已经把这个单行代码放在我的 cloudinit 用户数据中:`while fuser /var/lib/dpkg/lock >/dev/null 2>&1; 做睡眠1; 完毕; dpkg -i package.deb` 效果很好。 (3认同)
  • 您的脚本如何管理 apt-get 的堆叠实例?就像,在它完成之前我再启动 5 个 apt-get? (2认同)

Jor*_*tro 38

您可以使用aptdcon命令联机帮助页图标 通过与 aptdaemon 通信而不是直接使用 apt-get 来排队包管理器任务。

所以基本上你可以做sudo aptdcon --install chromium-browser任何事情,当该命令正在运行时,你可以再次运行它,但安装不同的软件包,apt-daemon 只会将它们排入队列而不是出错。

如果您正在进行长时间的升级或其他事情并希望继续安装软件包,或者您正在编写脚本并希望确保安装内容更可靠,这将特别有用。

  • 可以运行 `aptdcon` 使其像 `apt-get -y` 那样接受任何提示吗? (4认同)
  • `是| aptdcon --hide-terminal --install "package"` 需要隐藏终端,否则管道 `yes` 会导致问题。 (4认同)
  • 这个答案的问题在于它需要安装 `aptdcon`。我正在编写一个引导程序脚本,该脚本执行 VPS 的初始设置,其中后台进程也在执行一些初始设置。在我可以解决锁定之前,我无法安装 `aptdcon`。 (2认同)
  • @FakeName 用于您可能想要使用 cloud-init 的初始服务器配置:http://cloudinit.readthedocs.io/en/latest/ (2认同)

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 的某些操作是交互式的(“您确定要删除所有这些包吗?!”),我看不出有什么好的方法可以解决这个问题...

  • 我发现以下解决方案更完整,因为在使用 apt-get 时涉及多个锁:`while sudo fuser /var/lib/dpkg/lock /var/lib/apt/lists/lock /var/cache/ apt/archives/lock >/dev/null 2>&1; 做 echo '等待释放 dpkg/apt 锁'; 睡5;完毕; sudo apt-get -yy 更新` (5认同)
  • 虽然不确定`-y`是否可取。 (3认同)

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-upgradeapt-get's upgrade/dist-upgradeaptitude's safe-upgrade/的对应物full-upgrade。这些不需要参数。
  • 还有其他一些操作,可以在手册中找到。但是,这些是对aptd. 有些选项与 what apt-keyapt-cachedpkgdo重叠。

apt-get本身不支持这样的方法(等待 apt 的其他实例),因此aptdcon是 GUI 包管理器的首选解决方案:USCaptd用作后端,与 Synaptic 相同。其他解决方案是packagekit,但它不支持您正在寻找的功能(还)。


Men*_*hak 8

从 1.9.11 开始aptapt-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 中