Bash — как проверить, можно ли установить пакеты, если запущен apt-get/dpkg?

В сценарии bash я хочу установить пакет. Прежде чем сделать это в здравом уме, мне нужно проверить, не работает ли уже какой-либо другой экземпляр apt-get или dpkg. Если бы это было так, apt-get потерпел бы неудачу, потому что он уже заблокирован.

Достаточно ли проверить, существуют ли /var/lib/dpkg/lock и /var/lib/apt/lists/lock, и если оба не существуют, установка безопасна?


person user28464    schedule 02.08.2013    source источник


Ответы (4)


В Debian Wheezy (на данный момент стабильной) эти файлы существуют всегда. Поэтому я нашел использование lsof /var/lib/dpkg/lock более полезной проверкой. Он возвращает 1, если ничто не использует блокировку, и 0, если она используется, поэтому:

lsof /var/lib/dpkg/lock >/dev/null 2>&1
[ $? = 0 ] && echo "dpkg lock in use"
person Ryley    schedule 14.01.2014
comment
Не забывайте — это нужно запускать под учетной записью sudo или root. - person norekhov; 22.06.2021

Проверка файлов блокировки недостаточна и ненадежна. Возможно, вам действительно нужно проверить, заблокирована ли база данных 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
person Onlyjob    schedule 25.08.2014
comment
Не уверен, почему, но lsof и fuser не работали для меня в гостевой виртуальной коробке (ни один из них ничего не выводил, и оба возвращали 1, несмотря ни на что). Это решение спасло меня. - person kael; 28.01.2018

Вы можете просто проверить, запущены ли apt-get или dpkg:

ps -C apt-get,dpkg >/dev/null && echo "installing software" || echo "all clear"
person Guss    schedule 06.04.2015
comment
Потенциальным недостатком этого метода является то, что существует множество возможных приложений, которые могут заблокировать apt. Начиная с Ubuntu 16.04 apt является предпочтительной командой, которую ваш тест не поймает. Отслеживание возможных внешних интерфейсов может оказаться головной болью. - person David Baucum; 15.03.2017

Это зависит от того, насколько хорошо вы хотите обрабатывать ошибки 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 отдельно.

person diogovk    schedule 30.09.2013