【问题标题】:Bash - how to check if packages can be installed, if apt-get/dpkg is running?Bash - 如何检查是否可以安装软件包,如果 apt-get/dpkg 正在运行?
【发布时间】:2013-08-03 05:29:59
【问题描述】:

我想在一个 bash 脚本中安装一个包。在明智地这样做之前,我需要检查apt-getdpkg 的其他实例是否已经在工作。如果是这种情况,apt-get 将会失败,因为它已经被锁定了。

检查/var/lib/dpkg/lock/var/lib/apt/lists/lock是否存在就足够了,如果两者都不存在,安装是否安全?

【问题讨论】:

    标签: apt-get dpkg


    【解决方案1】:

    这取决于您希望如何处理 apt-get 错误。 根据您的需要检查/var/lib/dpkg/lock/var/lib/apt/lists/lock 很好,但如果您想格外小心,您可以进行模拟并检查返回码,如下所示:

    if sudo apt-get --simulate install packageThatDoesntExist      
    then echo "we're good"
    else echo "oops, something happened"
    fi
    

    举个例子:

    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    E: Unable to locate package packageThatDoesntExist
    oops, something happened
    

    编辑:--simulate 不会检查锁,因此您可能需要在此处进行额外检查。如果您想单独检查 sudo,您可能还想删除 sudo

    【讨论】:

      【解决方案2】:

      在 Debian Wheezy(当前稳定)中,这些文件始终存在。因此我发现使用lsof /var/lib/dpkg/lock 是一个更有用的检查。如果没有人使用锁,则返回 1,如果是,则返回 0,所以:

      lsof /var/lib/dpkg/lock >/dev/null 2>&1
      [ $? = 0 ] && echo "dpkg lock in use"
      

      【讨论】:

      • 别忘了 - 这需要在 sudo 或 root 帐户下运行。
      【解决方案3】:

      检查锁定文件不足且不可靠。也许您真正想做的是检查dpkg 数据库是否被锁定。我使用以下方法:

      ## check if DPKG database is locked
      dpkg -i /dev/zero 2>/dev/null
      if [ "$?" -eq 2 ]; then
          echo "E: dpkg database is locked."
      fi
      

      希望有更好的方法...
      此外,我还做了以下检查,因为如果有损坏的包等,安装可能不安全:

      apt-get check >/dev/null 2>&1
      if [ "$?" -ne 0 ]; then
          echo "E: \`apt-get check\` failed, you may have broken packages. Aborting..."
      fi
      

      【讨论】:

      • 不知道为什么,但是 lsof 和 fuser 在 vi​​rtualbox 客户机上都失败了(两者都没有输出任何东西,无论如何都返回 1)。这个解决方案救了我。
      • 这很有趣,因为它很容易受到 TOCTOU 的影响。
      【解决方案4】:

      您可以简单地检查 apt-get 或 dpkg 是否正在运行:

      ps -C apt-get,dpkg >/dev/null && echo "installing software" || echo "all clear"
      

      【讨论】:

      • 这种方法的一个潜在缺点是有许多可能的应用程序可以锁定 apt。从 Ubuntu 16.04 开始,apt 是首选命令,您的测试无法捕获。跟上可能的前端可能会让人头疼。
      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 2014-11-06
      • 1970-01-01
      • 2013-10-02
      • 2014-06-29
      • 2020-12-22
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多