Wie listet man Prozesse auf, die Dateien sperren?

51

Bei Verwendung von flockkönnen mehrere Prozesse gleichzeitig eine gemeinsame Sperre haben oder darauf warten, eine Schreibsperre zu erhalten. Wie bekomme ich eine Liste dieser Prozesse?

Dies bedeutet, dass für eine gegebene Datei X idealerweise die Prozess-ID jedes Prozesses gefunden wird, der eine Sperre für die Datei enthält oder auf diese wartet. Es wäre jedoch ein sehr guter Anfang, um die Anzahl der Prozesse zu ermitteln, die auf eine Sperre warten.

Benubird
quelle

Antworten:

42

lslocksmacht genau das aus dem util-linux-Paket .

In der MODESpalte werden Prozesse, die auf eine Sperre warten, mit einem gekennzeichnet *.

mattdm
quelle
3
Laut Apt-Cache ist util-linux bereits die neueste Version (2.20.1-1ubuntu3), aber ich habe keine lslocks. Gibt es ein Repo, das ich benutzen kann, um es mir zu geben?
Benubird
2
Es sieht so aus, als ob dies in 2.22 hinzugefügt wurde, sodass Ubuntus Version zu alt ist. Voraussichtlich wird irgendwann eine neue Version verfügbar sein. (Dies ist auch bei RHEL 6 oder CentOS der Fall.) Sie können es selbst erstellen oder den von lsofJoel Davis vorgeschlagenen Ansatz verwenden.
Mattdm
6
lslocksliest /proc/locks, zur Not können Sie das direkt selbst lesen, mit dem Vorbehalt, dass Dateien nicht nach Namen, sondern nach Gerät und Inode identifiziert werden. Da Sie die Datei kennen, sollte das kein Problem sein. Gesperrte Einträge haben ein ->Präfix vor der Spalte mit dem Sperrtyp (und fügen dieser Zeile daher eine Spalte hinzu).
mr.spuratic
27

Zwei Möglichkeiten: lsof(meine Präferenz) oder lslk(speziell für Dateisperren):

[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

Die Ausgabe von lslk ist selbsterklärend, fügt jedoch lsofdie Beschreibung der Sperre in die Spalte "FD" ein ( siehe 10uWoben). Von der Manpage:

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.

Die "FD" -Spalte von lsofoben gliedert sich also in:

10Der wörtliche Deskriptor dieser geöffneten Datei. Was ist verbunden mit/proc/1650/fd/10

u Die Datei ist zum Lesen und Schreiben geöffnet

W Programm hat eine Schreibsperre für die Datei.

Bratchley
quelle
1
Ich kann nicht finden, wo ich lslk bekomme, und es scheint nicht mehr gewartet zu werden. Erwähnenswert ist auch, dass, wenn lsof nur die Prozesse anzeigen soll, die die Datei tatsächlich sperren, Sie nach "^ mutex" suchen müssen. Es wird auch nicht zwischen "Halten" und "Blockieren" unterschieden.
Benubird
Der erste Buchstabe des FD-Felds ist die Datei, mit der die Datei geöffnet wurde (ich nehme an, das meinen Sie mit Halten). Der optionale zweite Buchstabe ist die Sperre (falls vorhanden) für die Datei (die ich ' Ich gehe davon aus, was Sie unter "Blockieren" verstehen. Also flock! = mutex. Ihr grep hätte Sperren wie die in der Post verpasst (ganz zu schweigen von dem ersten Feld ist Programmname ...)
Bratchley
D'oh! Sie haben Recht - "Mutex" war der Name meines Skripts, daher gilt das Greifen nach "Mutex" nur für meinen Fall. Vielen Dank für den Hinweis
Benubird
Es sieht so aus, als hätte ich auch einen Boo-Boo gemacht: "Der erste Buchstabe ist der Modus , in dem die Datei geöffnet wurde mit ..."
Bratchley
5

lsof kann helfen, die Liste der Dateien anzuzeigen. Hier sehen Sie die gesperrten Dateien.

sudo lsof /var/lib/dpkg/lock 
Hafiz Shehbaz Ali
quelle
0

Falls lsofselbst auf dem System fehlt, ls /proc/*/fd/* | grep LOCK_FILE_NAMEsollten die gleichen Informationen zur Verfügung gestellt werden.

PypeBros
quelle