dpkg: error: la base de datos de estado dpkg está bloqueada por otro proceso

69

Me preguntaba si alguien podría decirme qué significa esto:

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:~$ 

¿Cómo ejecuto sudo dpkg --configure -a manualmente?

reidar
fuente
¿Es importante esta máquina, es decir, puede reiniciarla? Debería resolver esto realmente rápido
Huckle

Respuestas:

95

Primer intento:

lsof /var/lib/dpkg/lock

Luego, asegúrese de que el proceso no se esté ejecutando:

ps cax | grep PID

Si se está ejecutando:

kill PID
#wait
kill -9 PID

Asegúrese de que el proceso esté hecho:

ps cax | grep PID

Luego, elimine el archivo de bloqueo:

sudo rm /var/lib/dpkg/lock

Deje que dpkg se arregle solo:

sudo dpkg --configure -a

Deberías estar bien después :)

ayudante
fuente
77
Nunca se deben eliminar los archivos de bloqueo manualmente. Están ahí por una razón. Por favor, solo use esto como último recurso. Primero intente identificar y cerrar otras aplicaciones utilizando la administración de paquetes.
gertvdijk
8
Si hay un proceso que realmente usa el archivo de bloqueo, probablemente sería mejor eliminar ese proceso en lugar de simplemente eliminar el archivo de bloqueo. Debería poder encontrar el proceso con lsof /var/lib/dpkg/lock.
Abe Voelker
Un fuerte +1 para el comentario de Abe. Nunca elimine un archivo de bloqueo sin eliminar todos los procesos que tienen descriptores de archivo abiertos.
Pooyan Khosravi
1
@ Xen2050 IMO, una nueva respuesta agrega desorden innecesario. Si crees que un script bash que hace lo mismo automáticamente es utilizable, lo escribiré como otra respuesta.
Pooyan Khosravi
1
Tal como está ahora, esta es definitivamente la mejor respuesta. Sí, es muy importante asegurarse de que ningún proceso en ejecución sea el propietario del bloqueo. Ya lo había comprobado, no se estaba ejecutando nada y necesitaba saber cómo eliminar el bloqueo anterior. Esta respuesta cubre todas las bases.
Lambart el
9

No puede ejecutar varios paquetes de aplicaciones / comandos / herramientas al mismo tiempo. A veces, significa que Synaptic, apt-get o la herramienta de actualización de paquetes se están ejecutando en segundo plano. Simplemente cierre otras herramientas de paquete o espere a que finalicen. Y dpkg se ejecutará.

ttoine
fuente
8

También se podría intentar:

sudo apt-get install -f

Para arreglar cualquier paquete roto:

Reparar; Intente corregir un sistema con dependencias rotas en su lugar. Esta opción, cuando se usa con instalar / eliminar, puede omitir cualquier paquete para permitir que APT deduzca una solución probable. Si se especifican paquetes, estos deben corregir completamente el problema. La opción a veces es necesaria cuando se ejecuta APT por primera vez; APT en sí mismo no permite que existan dependencias de paquetes rotos en un sistema. Es posible que la estructura de dependencia de un sistema pueda ser tan corrupta que requiera intervención manual (lo que generalmente significa usar dselect(1)o dpkg --removeeliminar algunos de los paquetes ofensivos). El uso de esta opción junto con -m puede producir un error en algunas situaciones. Elemento de configuración: APT :: Get :: Fix-Broken.

cuchilla19899
fuente
3

Lo siguiente debería ayudar:

sudo rm /var/lib/dpkg/lock

sudo dpkg --configure -a
Deepak Singhvi
fuente
Gracias, funciona para mí
Thavaprakash Swaminathan
1

Un enfoque es simplemente reiniciar la PC. Esto funcionó para mí.

princebillyGK
fuente
0

Esto puede suceder si se interrumpió el proceso de actualización (como si se perdiera la conexión). Puede intentar usar la pantalla como root ( sudo su) para volver a la sesión.

screen -r
Xeoncross
fuente
0

Aquí hay algunas buenas respuestas, pero solo quería agregar un método que no sea lsof para encontrar al usuario de bloqueo dpkg

Paso 1: descubre quién está bloqueando dpkg:

Opción # 1: Uso de lsof (no siempre instalado en la máquina)

lsof /var/lib/dpkg/lock

Opción # 2: usar 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

Paso 2: Decide qué quieres hacer con el usuario actual de dpkg

Si no existe tal proceso, no hay nada que decidir, simplemente salte al siguiente paso.

De lo contrario, debe decidir si desea eliminar el proceso o dejar que finalice con gracia. Si decides matarlo, solo úsalo kill <pid>. Si el proceso aún no muere, puede considerar matarlo usando kill -9 <pid>, pero podría crear ciertas inconsistencias y le aconsejo que no lo haga, a menos que sepa lo que está haciendo.

Paso 3: elimine el archivo de bloqueo

sudo rm /var/lib/dpkg/lock

Paso 4: arreglar el estado interno de dpkg

sudo dpkg --configure -a

Daniel Trugman
fuente
0

En nuestro caso no había ningún proceso en ejecución (PID), así que paré por completo y reinicié el VPS.

A continuación, hay varios archivos de bloqueo que deben eliminarse:

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

Entonces puedes arreglarlo dpkgcomo se sugiere:

sudo apt update
sudo dpkg --configure -a
jessuppi
fuente
¿Para qué sirven los archivos de bloqueo?
jarno hace