在 bash 脚本中,我想安装一个包。在明智地这样做之前,我需要检查是否没有其他实例apt-get
或dpkg
已经在工作。如果是这样的话,apt-get
就会失败,因为它已经被锁定了。
检查是否存在就足够了/var/lib/dpkg/lock
,/var/lib/apt/lists/lock
如果两者都不存在,安装是否安全?
检查锁定文件不足且不可靠。也许你真正想做的是检查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
在 Debian Wheezy(当前稳定)中,这些文件始终存在。因此,我发现 usinglsof /var/lib/dpkg/lock
是一个更有用的检查。如果没有使用锁,则返回 1,如果使用,则返回 0,因此:
lsof /var/lib/dpkg/lock >/dev/null 2>&1
[ $? = 0 ] && echo "dpkg lock in use"
这取决于您想要处理 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。
您可以简单地检查 apt-get 或 dpkg 是否正在运行:
ps -C apt-get,dpkg >/dev/null && echo "installing software" || echo "all clear"