【发布时间】:2013-08-03 05:29:59
【问题描述】:
我想在一个 bash 脚本中安装一个包。在明智地这样做之前,我需要检查apt-get 或dpkg 的其他实例是否已经在工作。如果是这种情况,apt-get 将会失败,因为它已经被锁定了。
检查/var/lib/dpkg/lock和/var/lib/apt/lists/lock是否存在就足够了,如果两者都不存在,安装是否安全?
【问题讨论】:
我想在一个 bash 脚本中安装一个包。在明智地这样做之前,我需要检查apt-get 或dpkg 的其他实例是否已经在工作。如果是这种情况,apt-get 将会失败,因为它已经被锁定了。
检查/var/lib/dpkg/lock和/var/lib/apt/lists/lock是否存在就足够了,如果两者都不存在,安装是否安全?
【问题讨论】:
这取决于您希望如何处理 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。
【讨论】:
在 Debian Wheezy(当前稳定)中,这些文件始终存在。因此我发现使用lsof /var/lib/dpkg/lock 是一个更有用的检查。如果没有人使用锁,则返回 1,如果是,则返回 0,所以:
lsof /var/lib/dpkg/lock >/dev/null 2>&1
[ $? = 0 ] && echo "dpkg lock in use"
【讨论】:
检查锁定文件不足且不可靠。也许您真正想做的是检查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
【讨论】:
您可以简单地检查 apt-get 或 dpkg 是否正在运行:
ps -C apt-get,dpkg >/dev/null && echo "installing software" || echo "all clear"
【讨论】:
apt 是首选命令,您的测试无法捕获。跟上可能的前端可能会让人头疼。