dpkg: error: o banco de dados de status do dpkg está bloqueado por outro processo

69

Eu apenas me perguntei se alguém poderia me dizer o que isso significa:

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

Como executo sudo dpkg --configure -a manualmente?

reidar
fonte
Esta máquina é importante, ou seja, você pode reiniciá-la? Deve resolver este bem rápido
Huckle

Respostas:

95

Primeira corrida:

lsof /var/lib/dpkg/lock

Em seguida, verifique se o processo não está em execução:

ps cax | grep PID

Se estiver em execução:

kill PID
#wait
kill -9 PID

Verifique se o processo está concluído:

ps cax | grep PID

Em seguida, remova o arquivo de bloqueio:

sudo rm /var/lib/dpkg/lock

Deixe o dpkg se consertar:

sudo dpkg --configure -a

Você deve ficar bem depois :)

ajudante
fonte
7
Nunca se deve remover arquivos de bloqueio manualmente. Eles estão lá por uma razão. Por favor, use isso apenas como último recurso. Primeiro, tente identificar e fechar outros aplicativos usando o gerenciamento de pacotes.
gertvdijk
8
Se houver um processo realmente usando o arquivo de bloqueio, provavelmente seria melhor interromper esse processo em vez de apenas remover o arquivo de bloqueio. Você deve conseguir encontrar o processo com lsof /var/lib/dpkg/lock.
Abe Voelker
Um +1 forte para o comentário de Abe. Nunca remova um arquivo de bloqueio sem matar todos os processos que possuem descritores de arquivo abertos.
Pooyan Khosravi
11
@ Xen2050 IMO, uma nova resposta adiciona confusão desnecessária. Se você acha que um script bash que faz a mesma coisa automaticamente é utilizável, escreverei como outra resposta.
Pooyan Khosravi
11
Como está agora, esta é definitivamente a melhor resposta. Sim, é muito importante garantir que nenhum processo em execução possua o bloqueio. Eu já tinha verificado isso, não havia nada em execução e precisava saber como excluir a fechadura antiga. Esta resposta cobre todas as bases.
Lambart 04/04
9

Você não pode executar vários pacotes de aplicativos / comandos / ferramentas ao mesmo tempo. Às vezes, isso significa que o synaptic, o apt-get ou a ferramenta de atualização de pacotes estão em execução no backgroung. Apenas feche outras ferramentas de pacote ou aguarde o término. E o dpkg será executado.

ttoine
fonte
8

Pode-se também tentar:

sudo apt-get install -f

Para corrigir quaisquer pacotes quebrados:

Consertar; tente corrigir um sistema com dependências quebradas. Essa opção, quando usada com instalação / remoção, pode omitir quaisquer pacotes para permitir que o APT deduza uma solução provável. Se pacotes são especificados, eles precisam corrigir completamente o problema. Às vezes, a opção é necessária ao executar o APT pela primeira vez; O próprio APT não permite que dependências de pacotes quebradas existam em um sistema. É possível que a estrutura de dependência de um sistema seja tão corrompida que exija intervenção manual (o que geralmente significa usar dselect(1)ou dpkg --removeeliminar alguns dos pacotes incorretos). O uso desta opção junto com -m pode gerar um erro em algumas situações. Item de configuração: APT :: Get :: Fix-Broken.

blade19899
fonte
3

A seguir, deve ajudar:

sudo rm /var/lib/dpkg/lock

sudo dpkg --configure -a
Deepak Singhvi
fonte
Obrigado, funciona para mim
Thavaprakash Swaminathan
1

Uma abordagem é apenas reiniciar o PC. Isso funcionou para mim.

princebillyGK
fonte
0

Isso pode acontecer se o processo de atualização for interrompido (como se sua conexão estivesse perdida). Você pode tentar usar a tela como root ( sudo su) para voltar à sessão.

screen -r
Xeoncross
fonte
0

Há algumas boas respostas aqui, mas só queria adicionar um método não-lsof para encontrar o usuário dpkg lock

Etapa 1: Descubra quem está bloqueando o dpkg:

Opção 1: Usando lsof (nem sempre instalado na máquina)

lsof /var/lib/dpkg/lock

Opção 2: Usando o 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

Etapa 2: decida o que você deseja fazer com o usuário atual do dpkg

Se não houver esse processo, não há nada a decidir, basta pular para a próxima etapa.

Caso contrário, você deve decidir se deseja interromper o processo ou deixá-lo terminar normalmente. Se você decidir matá-lo, basta usar kill <pid>. Se o processo ainda não morrer, considere matá-lo usando-o kill -9 <pid>, mas isso pode criar certas inconsistências e eu o aconselho a menos que você saiba o que está fazendo.

Etapa 3: Remova o arquivo de bloqueio

sudo rm /var/lib/dpkg/lock

Etapa 4: Corrigir o estado interno do dpkg

sudo dpkg --configure -a

Daniel Trugman
fonte
0

No nosso caso, não havia processo em execução (PID), então parei e reinicializei o VPS.

Em seguida, existem vários arquivos de bloqueio que podem precisar ser removidos:

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

Em seguida, você pode corrigir dpkgcomo sugerido:

sudo apt update
sudo dpkg --configure -a
jessuppi
fonte
Para que servem os arquivos de bloqueio?
jarno