4

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

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

4

4 回答 4

2

检查锁定文件不足且不可靠。也许你真正想做的是检查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
于 2014-08-25T03:01:28.930 回答
2

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

lsof /var/lib/dpkg/lock >/dev/null 2>&1
[ $? = 0 ] && echo "dpkg lock in use"
于 2014-01-14T19:27:38.493 回答
2

这取决于您想要处理 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,您可能还想删除sudo。

于 2013-09-30T12:17:47.327 回答
2

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

ps -C apt-get,dpkg >/dev/null && echo "installing software" || echo "all clear"
于 2015-04-06T12:07:44.580 回答