У меня есть скрипты, которые новые пользователи запускают для настройки своей системы, в основном скрипт bash с большим циклом for, например:
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
, так как вы будете упускать из виду основную проблему, пробиваясь через нее. - person slayedbylucifer   schedule 12.05.2014rm -f /var/lib/dpkg/lock
непосредственно перед командойapt-get ...
в циклеfor
. Таким образом, вы снимете блокировку (если она есть) перед запуском установки пакета. - person slayedbylucifer   schedule 12.05.2014until dpkg -s ${PACKAGE} >> /dev/null; do sleep 1; done
? Возможно, проверьте фактическое значение$?
, если переустановка пакета возвращает ошибку... - person anishsane   schedule 12.05.2014