ファイルをロックしているプロセスをリストする方法は?


51

を使用するとflock、複数のプロセスが同時に共有ロックを保持したり、書き込みロックの取得を待機したりできます。これらのプロセスのリストを取得するにはどうすればよいですか?

つまり、ファイルXについて、理想的には、ファイルのロックを保持している、または待機している各プロセスのプロセスIDを見つけることです。ただし、ロックを待機しているプロセスの数を取得するだけでも非常に良いスタートになります。

回答:


42

lslocksutil-linuxパッケージから、まさにこれを行います。

ではMODE、カラム、ロックを待っているプロセスはマークが付きます*


3
Apt-cacheは、util-linuxがすでに最新バージョン(2.20.1-1ubuntu3)であると言っていますが、lslockがありません。使用できるレポはありますか?
ベヌバード

2
これは2.22で追加されたように見えるため、Ubuntuのバージョンは古すぎます。おそらく、新しいバージョンが最終的に利用可能になるでしょう。(これはRHEL 6またはCentOSでも同様です。)自分でビルドすることも、lsofJoel Davisが提案するアプローチを使用することもできます。
mattdm

6
lslocks読み取り/proc/locks、ピンチでは、ファイルを名前ではなくデバイスとiノードで識別するという注意を払って、自分で直接読み取ることができます。ファイルを知っているので、それは問題ではないはずです。ブロックされたエントリには->、ロックタイプの列の前に接頭辞があります(したがって、その行に列が追加されます)。
Mr.spuratic

27

2つの可能性:(lsof私の好み)またはlslk(特にファイルロック用):

[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

lslkの出力は自己lsof説明的ですが、「FD」列(10uW上記)にロックの説明を入れます。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.

したがって、上記の「FD」列は次のlsofように分類されます。

10この開いているファイルのリテラル記述子。にリンクされているもの/proc/1650/fd/10

u ファイルは読み取りおよび書き込み用に開かれています

W プログラムはファイルの書き込みロックを持っています。


1
lslkの入手先が見つからず、メンテナンスされていないようです。また、lsofに実際にファイルをロックしているプロセスのみを表示する場合は、「^ mutex」をgrepする必要があることも指摘しておく必要があります。また、「保持」と「ブロック」を区別しません。
ベヌバード

FDフィールドの最初の文字は、ファイルを開いた状態のファイルです(保持するという意味です)。オプションの2番目の文字は、ファイルにあるロック(もしあれば)ですmは、「ブロッキング」が意味するものと仮定します)またflock!=ミューテックス。あなたのgrepは、投稿にあるようなロックを見逃しているでしょう(最初のフィールドはプログラム名です...)
Bratchley

ど!そうです-「mutex」は私のスクリプトの名前だったので、「mutex」をgrepすることは私の場合にのみ適用されます。それを指摘してくれてありがとう
ベヌバード

私もブーブーを作ったようです。「最初の文字は、ファイルを開いたモードです...」
ブラチリー


0

場合にはlsof、それ自体がシステムに不足している、ls /proc/*/fd/* | grep LOCK_FILE_NAME同じ情報を提供する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.