Jak wyświetlić listę plików blokujących procesy?


51

Korzystając z tego flock, kilka procesów może mieć blokadę współdzieloną w tym samym czasie lub czekać na uzyskanie blokady zapisu. Jak uzyskać listę tych procesów?

Oznacza to, że dla danego pliku X idealnie jest znaleźć identyfikator każdego procesu, który wstrzymuje lub oczekuje blokady pliku. Byłby to jednak bardzo dobry początek, aby uzyskać liczbę procesów oczekujących na blokadę.

Odpowiedzi:


42

lslocks, z pakietu util-linux robi dokładnie to.

W MODEkolumnie procesy oczekujące na blokadę zostaną oznaczone symbolem *.


3
Apt-cache mówi, że util-linux jest już najnowszą wersją (2.20.1-1ubuntu3), ale nie mam lslocka; czy mogę skorzystać z repozytorium, które mi to zapewni?
Benubird,

2
Wygląda na to, że został dodany w wersji 2.22, więc wersja Ubuntu jest za stara. Prawdopodobnie w końcu będzie dostępna nowa wersja. (Dotyczy to również RHEL 6 lub CentOS.) Możesz zbudować go samodzielnie lub zastosować lsofpodejście sugerowane przez Joela Davisa.
mattdm,

6
lslocksczyta /proc/locks, w mgnieniu oka możesz przeczytać to bezpośrednio, z zastrzeżeniem, że pliki są identyfikowane przez urządzenie i i-węzeł, a nie nazwę. Ponieważ znasz plik, nie powinno to stanowić problemu. Zablokowane wpisy mają ->prefiks przed kolumną typu blokady (co powoduje dodanie kolumny do tej linii).
mr.spuratic

27

Dwie możliwości: lsof(moje preferencje) lub lslk(specjalnie dla blokad plików):

[root@policyServer ~]# lslk | grep "master.lock"
SRC          PID   DEV  INUM   SZ TY M   ST WH  END LEN NAME
master      1650 253,0 12423   33  w 0    0  0    0   0 /var/lib/postfix/master.lock

[root@policyServer ~]# lsof | grep "master.lock"
master     1650      root   10uW     REG              253,0       33      12423 /var/lib/postfix/master.lock

Wyjście lslk jest samo-ekspansywne, ale lsofumieszcza opis blokady w kolumnie „FD” ( 10uWpowyżej). Ze strony podręcznika:

The mode character is followed by one of these lock characters, describing the type of lock applied to the file:

N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part      of the file;
X for an SCO OpenServer Xenix lock on the      entire file;
                       space if there is no lock.

Tak więc lsofpowyższa kolumna „FD” dzieli się na:

10Dosłowny deskryptor tego otwartego pliku. Co jest powiązane przez/proc/1650/fd/10

u Plik jest otwarty do odczytu i zapisu

W program ma blokadę zapisu w pliku.


1
Nie mogę znaleźć skąd wziąć lslk i wydaje się, że nie jest już obsługiwany. Warto również zauważyć, że jeśli chcesz, aby lsof pokazywał tylko procesy, które faktycznie blokują plik, musisz grep dla "^ mutex". Nie rozróżnia także „trzymania” i „blokowania”.
Benubird

Pierwszą literą pola FD jest plik, w którym plik został otwarty (zakładam, że to masz na myśli, trzymając) opcjonalny znak drugiej litery to blokada (jeśli istnieje), którą posiada w pliku (który „ m zakładając, że masz na myśli „blokowanie”) Także flock! = mutex. Twój grep byłby brakowało zamki jak ten w poście (nie wspominając pierwsze pole jest nazwa programu ...)
Bratchley

Nie! Masz rację - „mutex” to nazwa mojego skryptu, więc grep dla „mutex” dotyczy tylko mojego przypadku. Dzięki za zwrócenie na to uwagi
Benubird,

dobrze wygląda Zrobiłem boo-boo too „charakter pierwsza litera jest tryb to plik otwarty z ...”
Bratchley

5

lsof może pomóc zobaczyć listę plików. tutaj jest sposób, aby zobaczyć zablokowane pliki.

sudo lsof /var/lib/dpkg/lock 

0

w przypadku lsofbraku samego systemu, ls /proc/*/fd/* | grep LOCK_FILE_NAMEpowinien podać te same informacje.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.