【发布时间】:2014-06-29 21:50:11
【问题描述】:
我有新用户用来配置系统的脚本,基本上是一个带有大 for 循环的 bash 脚本,如下所示:
DEBCOUNT=${#DEBS[@]}
for (( i=0; i<${DEBCOUNT}; i++ ));
do
PACKAGE=${DEBS[$i]}
dpkg -s ${PACKAGE} >> /dev/null
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo -n =========== Installing ${PACKAGE}
echo " ( $((${i}*100/${DEBCOUNT}))% )"
apt-get -qq install -y --force-yes ${PACKAGE}
if [ $? -ne 0 ]; then
echo ERROR: Failed to install required package ${PACKAGE}
exit 1
fi
else
echo -n =========== Skipping ${PACKAGE}
echo " ( $((${i}*100/${DEBCOUNT}))% )"
fi
done
DEBS 大数组是要在新系统(主要是编译器和编辑器)上安装的 50 个包的列表。
它工作得很好,除非某些系统进程启动并开始在后台更新 APT 数据库。然后它以dpkg: error: dpkg status database is locked by another process 失败。
是否有一种优雅/稳健的方法来避免此错误?要么通过检测它并以某种方式等待它空闲,要么通过首先阻止它。
回复
- 我不想只删除锁定文件。尝试安装我的东西以及系统同时执行的任何操作都会不可避免地破坏某些东西。
- 我无法在启动时进行一次检查,因为我所看到的似乎表明另一个进程正在进行我想要的那种等待,并在我的两个进程之间跳转
apt-get的。 - 锁定的不是单个进程。有时我认为是 ubuntu 软件更新程序,有时我认为这是
cron运行大型apt-get update的工作。
【问题讨论】:
-
为什么不使用
apt-get一次性使用所有包,而不是一个接一个地安装包?此外,--force-yes肯定是我将永远避免的事情,因为您在强行通过时会忽略潜在的问题。 -
你不能在 Ubuntu 上同时安装两个包。
-
大命令是最初的设计,但是一些包来自 PPA,如果安装失败,系统就会处于奇怪的状态。用户最终只安装了一半的包,一半没有,而且要弄清楚哪些丢失了并不容易。这更安全(尽管速度较慢)。
-
@avinash Duh .. 这就是问题的重点.. 我如何防止另一个进程这样做?或者我如何检测它,并知道它何时是安全的?
-
不确定这有多有效,但尝试在
for循环中的apt-get ...命令之前立即运行rm -f /var/lib/dpkg/lock。这样,您将在运行包安装之前杀死锁(如果有的话)。
标签: bash ubuntu debian apt dpkg