Jak zidentyfikować proces blokujący plik?

35

Chcę poznać dokładny proces, który używa pliku blokady. Nie chcę tego naprawiać , ale po prostu wiedzieć, co robi mój system. Jak mogę się dowiedzieć?

Na przykład ta wiadomość:

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

Ponownie chcę tylko zidentyfikować proces, który go używa, a nie jak to naprawić.

Braiam
źródło

Odpowiedzi:

38

Jest niesławny lsof:

sudo lsof /var/lib/dpkg/lock
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
aptitude 4974 root    3uW  REG   8,23        0 815673 /var/lib/dpkg/lock

W tym przypadku aptitude używa pliku. Powinieneś użyć roota, jeśli nie masz pewności, który użytkownik blokuje plik. Jest także przydatny w wielu sprawach, niestety nie jest instalowany z Ubuntu, więc musisz go najpierw zainstalować.

Dla reszty śmiertelników istnieje fuserrozkaz. Jest to szczególne, ponieważ zwraca tylko PID zamiast nazwy procesu:

➜  ~  sudo fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   4974

Tutaj jest napisane, że plik i PID, czyli 4974, musimy więc zbadać, kto jest:

➜  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude
Braiam
źródło
6
Dlaczego jest lsofniesławny? Czy są z tym jakieś problemy?
Ruslan
3
@ Ruslan Tak, pozwala użytkownikom nieświadomym poznać faktyczne użycie systemów w przeciwieństwie do tego, czego sysadmins chce ...
Braiam
@Braiam Zbyt wiele informacji może być niebezpieczną rzeczą w dobrych rękach? ^ -_- ^
Peter David Carter
Druga opcja w jednym wierszu:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea
8

lslocks to prosty sposób na zrobienie tego.

lslocks |grep /var/lib/dpkg/lock

Aby użyć powłoki do obsługi identyfikatora procesu:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
Jolestar
źródło
Tak. lslocksjest najlepszym sposobem, aby się tym zająć. Użycie lsofdało mi ten błąd: „lsof: OSTRZEŻENIE: system plików fuse.gvfsd-fuse nie może (fuse.gvfsd-fuse / run / user / 1000 / gvfs Informacje wyjściowe mogą być niekompletne”
Nav
@Nav To nie jest błąd, ale OSTRZEŻENIE.
Braiam