Come elencare i processi bloccando il file?


51

Utilizzando flock, diversi processi possono avere un blocco condiviso contemporaneamente o essere in attesa di acquisire un blocco di scrittura. Come posso ottenere un elenco di questi processi?

Cioè, per un dato file X, idealmente per trovare l'id di processo di ogni processo che contiene o è in attesa di un blocco sul file. Sarebbe un ottimo inizio anche solo per avere un conteggio del numero di processi in attesa di un blocco.

Risposte:


42

lslocks, dal pacchetto util-linux , fa esattamente questo.

Nella MODEcolonna, i processi in attesa di un blocco saranno contrassegnati con a *.


3
Apt-cache dice che util-linux è già la versione più recente (2.20.1-1ubuntu3), ma non ho lslocks; c'è un repository che posso usare che mi darà?
Benubird,

2
Sembra che questo sia stato aggiunto nella 2.22, quindi la versione di Ubuntu è troppo vecchia. Presumibilmente alla fine sarà disponibile una nuova versione. (Questo è anche il caso di RHEL 6 o CentOS.) Potresti costruirlo da solo o potresti usare l' lsofapproccio che Joel Davis suggerisce.
Mattdm,

6
lslockslegge /proc/locks, in un pizzico puoi leggerlo direttamente da solo, con l'avvertenza che i file sono identificati dal dispositivo e dall'inode piuttosto che dal nome. Dato che conosci il file, questo non dovrebbe essere un problema. Le voci bloccate hanno un ->prefisso prima della colonna del tipo di blocco (aggiungendo così una colonna a quella riga).
signor spuratic

27

Due possibilità: lsof(la mia preferenza) o lslk(specificamente per i blocchi di file):

[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

L'output di lslk è autoespandibile ma lsofinserisce la descrizione del blocco nella colonna "FD" (che è 10uWsopra). Dalla pagina man:

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.

Quindi la colonna "FD" di cui lsofsopra si suddivide in:

10Il descrittore letterale di questo file aperto. Cosa è collegato da/proc/1650/fd/10

u Il file è aperto per la lettura e la scrittura

W il programma ha un blocco di scrittura sul file.


1
Non riesco a trovare dove trovare lslk e sembra non essere più mantenuto. Vale anche la pena sottolineare che se si desidera che lsof mostri solo i processi che stanno effettivamente bloccando il file, è necessario grep per "^ mutex". Inoltre non distingue tra "trattenimento" e "blocco".
Benubird,

Il carattere della prima lettera del campo FD è il file con cui ha aperto il file (suppongo sia quello che intendi tenendo) il carattere facoltativo della seconda lettera è il blocco (se presente) che ha sul file (che io ' m supponendo che cosa intendi per "blocco") Inoltre flock! = mutex. Il tuo grep avrebbe perso blocchi come quello nel post (per non parlare del primo campo è il nome del programma ...)
Bratchley

D'oh! Hai ragione: "mutex" era il nome della mia sceneggiatura, quindi cercare "mutex" è applicabile solo al mio caso. Grazie per
averlo

sembra che anche io abbia fatto un boo-boo: "il carattere della prima lettera è la modalità con cui il file è aperto con ..."
Bratchley

5

lsof può aiutare a vedere l'elenco dei file. qui è il modo di vedere i file bloccati.

sudo lsof /var/lib/dpkg/lock 

0

nel caso in cui lsofmanchi sul sistema, ls /proc/*/fd/* | grep LOCK_FILE_NAMEdovrebbe fornire le stesse informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.