Bash - 如果apt-get / dpkg正在运行,如何检查是否可以安装软件包?

时间:2013-08-02 03:52:51

标签: apt-get dpkg

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

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

4 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

答案 2 :(得分:2)

您只需检查apt-get或dpkg是否正在运行:

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

答案 3 :(得分:1)

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

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