dpkg: ошибка: база данных статуса dpkg заблокирована другим процессом

69

Мне просто интересно, может кто-нибудь сказать мне, что это значит:

E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem.
reidsr@ubuntu:~$ sudo dpkg --configure -a
dpkg: error: dpkg status database is locked by another process
reidsr@ubuntu:~$ 

Как мне запустить sudo dpkg --configure -a вручную?

Рейдар
источник
Важна ли эта машина, можно ли ее перезагрузить? Должен решить это очень быстро
Huckle

Ответы:

95

Первый забег:

lsof /var/lib/dpkg/lock

Затем убедитесь, что процесс не запущен:

ps cax | grep PID

Если он работает:

kill PID
#wait
kill -9 PID

Убедитесь, что процесс завершен:

ps cax | grep PID

Затем удалите файл блокировки:

sudo rm /var/lib/dpkg/lock

Позвольте dpkg исправить себя:

sudo dpkg --configure -a

Вы должны быть в порядке потом :)

помощник
источник
7
Никогда не следует удалять файлы блокировки вручную. Они там по причине. Пожалуйста, используйте это только в качестве крайней меры. Сначала попытайтесь определить и закрыть другие приложения, используя управление пакетами.
gertvdijk
8
Если существует процесс, который на самом деле использует файл блокировки, вероятно, было бы лучше убить этот процесс, а не просто удалить файл блокировки. Вы должны быть в состоянии найти процесс с lsof /var/lib/dpkg/lock.
Абе Воелкер,
Сильный +1 за комментарий Абэ. Никогда не удаляйте файл блокировки, не убивая все процессы, которые имеют дескрипторы открытых файлов.
Пооян Хосрави
1
@ Xen2050 ИМО новый ответ добавляет ненужный беспорядок. Если вы думаете, что bash-скрипт, который делает то же самое автоматически, пригоден для использования, я напишу его как другой ответ.
Пооян Хосрави
1
В нынешнем виде это, безусловно, лучший ответ. Да, очень важно убедиться, что ни один из запущенных процессов не владеет блокировкой. Я уже проверил это, ничего не работало, и мне нужно было знать, как удалить старую блокировку. Этот ответ охватывает все основы.
Ламбарт
9

Вы не можете запускать несколько пакетов приложений / команд / инструментов одновременно. Иногда это означает, что в фоновом режиме работают synaptic, apt-get или инструмент обновления пакетов. Просто закройте другие инструменты пакета или дождитесь их завершения. И дпкг побежит.

ttoine
источник
8

Можно также попробовать:

sudo apt-get install -f

Чтобы исправить любые сломанные пакеты:

Fix; попытаться исправить систему с нарушенными зависимостями. Эта опция, когда используется с установкой / удалением, может пропустить любые пакеты, чтобы позволить APT вывести вероятное решение. Если указаны пакеты, они должны полностью устранить проблему. Эта опция иногда необходима при первом запуске APT; Сам APT не позволяет существующим в системе нарушенным зависимостям пакетов. Вполне возможно, что структура зависимостей системы может быть настолько повреждена, что потребует ручного вмешательства (что обычно означает использование dselect(1)или dpkg --removeудаление некоторых из нарушающих пакетов). Использование этой опции вместе с -m может привести к ошибке в некоторых ситуациях. Элемент конфигурации: APT :: Get :: Fix-Broken.

blade19899
источник
3

Следующее должно помочь:

sudo rm /var/lib/dpkg/lock

sudo dpkg --configure -a
Дипак Сингхви
источник
Спасибо, это работает для меня
Thavaprakash Swaminathan
1

Один из подходов - просто перезагрузить компьютер. Это сработало для меня.

princebillyGK
источник
0

Это может произойти, если процесс обновления был прерван (как будто ваше соединение было потеряно). Вы можете попробовать использовать screen как root ( sudo su), чтобы вернуться в сессию.

screen -r
Xeoncross
источник
0

Здесь есть несколько хороших ответов, но я просто хотел добавить не-lsof метод поиска пользователя блокировки dpkg

Шаг 1: Узнайте, кто блокирует dpkg:

Вариант № 1: Использование lsof (не всегда установлен на машине)

lsof /var/lib/dpkg/lock

Вариант № 2: Использование Bash

for pid in $(ls /proc | egrep [0-9]+); do sudo ls -l /proc/$pid/fd 2>/dev/null | grep /var/lib/dpkg/lock && echo $pid; done

Шаг 2: Решите, что вы хотите сделать с текущим пользователем dpkg

Если такого процесса нет, решать нечего, просто перейдите к следующему шагу.

В противном случае вы должны решить, хотите ли вы убить процесс или позволить ему закончить изящно. Если вы решили убить его, просто используйте kill <pid>. Если процесс все равно не умрет, вы можете подумать об его уничтожении kill -9 <pid>, но это может привести к определенным несоответствиям, и я советую не делать этого, если вы не знаете, что делаете.

Шаг 3: Удалить файл блокировки

sudo rm /var/lib/dpkg/lock

Шаг 4: Исправьте внутреннее состояние dpkg

sudo dpkg --configure -a

Даниэль Тругман
источник
0

В нашем случае не было запущенного процесса (PID), поэтому я жестко остановил и перезагрузил VPS.

Далее, есть несколько файлов блокировки, которые, возможно, потребуется удалить:

sudo rm /var/lib/dpkg/lock
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/cache/apt/archives/lock

Тогда вы можете исправить dpkgкак предложено:

sudo apt update
sudo dpkg --configure -a
jessuppi
источник
Для чего нужны файлы блокировки?
Ярно
@jarno Файлы блокировки - это просто метаданные, которые не позволяют процессам запускаться друг над другом или перезаписывать друг друга и т. д. Они должны быть очищены после завершения рассматриваемого процесса, но если процесс зависает, файлы блокировки могут оставаться неопределенно долго.
Джессуппи