flock
を使用すると、複数のプロセスが同時に共有ロックを持つか、書き込みロックの取得を待機できます。これらのプロセスのリストを取得するにはどうすればよいですか?
つまり、特定のファイルXについて、理想的には、ファイルのロックを保持しているか、ファイルのロックを待機している各プロセスのプロセスIDを見つけます。ロックを待機しているプロセスの数のカウントを取得するだけで、非常に良いスタートになります。
til-linuxパッケージ のlslocks
は、まさにこれを行います。
MODE
列では、ロックを待機しているプロセスは*
でマークされます。
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.
したがって、上記のlsof
の「FD」列は次のように分類されます。
10
この開いているファイルのリテラル記述子。 /proc/1650/fd/10
のリンク先
u
ファイルは読み取りおよび書き込み用に開いています
W
プログラムはファイルに書き込みロックを持っています。
lsofは、ファイルのリストを表示するのに役立ちます。ロックされたファイルを確認する方法を次に示します。
Sudo lsof /var/lib/dpkg/lock
lsof
自体がシステムにない場合、ls /proc/*/fd/* | grep LOCK_FILE_NAME
は同じ情報を提供する必要があります。