dpkg: błąd: baza danych statusu dpkg jest zablokowana przez inny proces

68

Zastanawiałem się, czy ktoś mógłby mi powiedzieć, co to znaczy:

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

Jak uruchomić sudo dpkg --configure -a ręcznie?

Reidar
źródło
Czy ta maszyna jest ważna, to znaczy, czy możesz ją ponownie uruchomić? Powinno to rozwiązać naprawdę szybko
Huckle,

Odpowiedzi:

94

Pierwszy bieg:

lsof /var/lib/dpkg/lock

Następnie upewnij się, że proces nie działa:

ps cax | grep PID

Jeśli jest uruchomiony:

kill PID
#wait
kill -9 PID

Upewnij się, że proces został zakończony:

ps cax | grep PID

Następnie usuń plik blokady:

sudo rm /var/lib/dpkg/lock

Pozwól dpkg sam się naprawić:

sudo dpkg --configure -a

Potem powinno być dobrze :)

pomocnik
źródło
7
Nigdy nie należy ręcznie usuwać plików blokujących. Są tam z jakiegoś powodu. Proszę, używaj tego tylko w ostateczności. Najpierw spróbuj zidentyfikować i zamknąć inne aplikacje za pomocą zarządzania pakietami.
gertvdijk
8
Jeśli proces faktycznie korzysta z pliku blokady, prawdopodobnie lepiej byłoby go zabić niż usunąć plik blokady. Powinieneś być w stanie znaleźć proces za pomocą lsof /var/lib/dpkg/lock.
Abe Voelker
Silna +1 za komentarz Abe. Nigdy nie usuwaj pliku blokującego bez zabicia wszystkich procesów, które mają otwarte deskryptory plików.
Pooyan Khosravi
1
@ Xen2050 IMO nowa odpowiedź dodaje niepotrzebnego bałaganu. Jeśli uważasz, że skrypt bash, który robi to samo automatycznie, jest użyteczny, napiszę go jako inną odpowiedź.
Pooyan Khosravi
1
W tej chwili jest to zdecydowanie najlepsza odpowiedź. Tak, bardzo ważne jest, aby upewnić się, że żaden uruchomiony proces nie jest właścicielem blokady. Już to sprawdziłem, nic nie działało i musiałem wiedzieć, jak usunąć starą blokadę. Ta odpowiedź obejmuje wszystkie podstawy.
Lambart
9

Nie można uruchomić kilku pakietów aplikacji / poleceń / narzędzi jednocześnie. Czasami oznacza to, że narzędzie synaptic, apt-get lub narzędzie do aktualizacji pakietów działa w tle. Po prostu zamknij inne narzędzia pakietu lub poczekaj na ich zakończenie. I uruchomi się dpkg.

ttoine
źródło
8

Można również spróbować:

sudo apt-get install -f

Aby naprawić wszelkie uszkodzone pakiety:

Naprawić; próba poprawienia systemu z przerwanymi zależnościami. Ta opcja, w połączeniu z instalacją / usunięciem, może pomijać wszelkie pakiety, aby umożliwić APT wywnioskować prawdopodobne rozwiązanie. Jeśli podano pakiety, muszą one całkowicie rozwiązać problem. Ta opcja jest czasami niezbędna przy pierwszym uruchomieniu APT; Sam APT nie pozwala na istnienie w systemie zależności od uszkodzonego pakietu. Możliwe jest, że struktura zależności systemu może być tak uszkodzona, że ​​wymaga ręcznej interwencji (co zwykle oznacza użycie dselect(1)lub dpkg --removewyeliminowanie niektórych szkodliwych pakietów). Użycie tej opcji razem z -m może spowodować błąd w niektórych sytuacjach. Element konfiguracji: APT :: Get :: Fix-Broken.

blade19899
źródło
3

Następujące powinny pomóc:

sudo rm /var/lib/dpkg/lock

sudo dpkg --configure -a
Deepak Singhvi
źródło
Dziękuję, działa dla mnie
Thavaprakash Swaminathan
1

Jednym z podejść jest ponowne uruchomienie komputera. To zadziałało dla mnie.

princebillyGK
źródło
0

Może się to zdarzyć, jeśli proces aktualizacji zostanie przerwany (jakby Twoje połączenie zostało utracone). Możesz spróbować użyć screena jako root ( sudo su), aby wrócić do sesji.

screen -r
Xeoncross
źródło
0

Jest tu kilka dobrych odpowiedzi, ale chciałem tylko dodać metodę nie-lsof znajdującą użytkownika blokady dpkg

Krok 1: Dowiedz się, kto blokuje dpkg:

Opcja nr 1: Korzystanie z lsof (nie zawsze instalowane na komputerze)

lsof /var/lib/dpkg/lock

Opcja # 2: Używanie 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

Krok 2: Zdecyduj, co chcesz zrobić z bieżącym użytkownikiem dpkg

Jeśli nie ma takiego procesu, nie ma co decydować, po prostu przejdź do następnego kroku.

W przeciwnym razie musisz zdecydować, czy chcesz zabić proces, czy zakończyć go z wdziękiem. Jeśli zdecydujesz się go zabić, po prostu użyj kill <pid>. Jeśli proces nadal nie umrze, możesz rozważyć zabicie go za pomocą kill -9 <pid>, ale może to spowodować pewne niespójności, a ja odradzam, chyba że wiesz, co robisz.

Krok 3: Usuń plik blokady

sudo rm /var/lib/dpkg/lock

Krok 4: Napraw stan wewnętrzny dpkg

sudo dpkg --configure -a

Daniel Trugman
źródło
0

W naszym przypadku nie było uruchomionego procesu (PID), więc mocno się zatrzymałem i ponownie uruchomiłem VPS.

Następnie istnieje kilka plików blokady, które mogą wymagać usunięcia:

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

Następnie możesz naprawić dpkgzgodnie z sugestią:

sudo apt update
sudo dpkg --configure -a
jessuppi
źródło