如何列出进程锁定文件?


51

使用flock,多个进程可以同时拥有一个共享锁,或者正在等待获取写锁。如何获得这些过程的清单?

也就是说,对于给定的文件X,理想情况下是查找持有或正在等待文件锁的每个进程的进程ID。尽管只是获得等待锁定的进程数的计数,但这将是一个很好的开始。

Answers:


42

lslocks,来自util-linux软件包,正是这样做的。

在该MODE列中,等待锁定的进程将用标记*


3
Apt-cache表示util-linux已经是最新版本(2.20.1-1ubuntu3),但是我没有lslocks。有可以使用的回购协议吗?
Benubird13年

2
看起来是在2.22中添加的,所以Ubuntu的版本太旧了。大概最终会有一个新版本可用。(RHEL 6或CentOS也是这种情况。)您可以自己构建它,也可以使用lsofJoel Davis建议的方法。
mattdm

6
lslocks读取时/proc/locks,您可以在需要时直接读取内容,但请注意,文件是通过设备和索引节点而不是名称来标识的。既然您知道文件,那应该没问题。被阻止的条目->在锁类型列之前有一个前缀(因此在该行中添加了列)。
2013年

27

两种可能性:(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上方)。从手册页:

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 程序对文件具有写锁定。


1
我找不到从哪里获取lslk,而且它似乎已不再维护。还值得指出的是,如果您希望lsof仅显示实际上正在锁定文件的进程,则需要对“ ^ mutex”使用grep。它还没有区分“持有”和“阻止”。
Benubird13年

FD字段的第一个字母字符是打开文件的文件(我假设这是您持有的意思),可选的第二个字母字符是文件上的锁(如果有的话) m假设是您所说的“阻塞”的意思))flock!您的grep可能会错过锁,例如帖子中的锁(更不用说第一个字段是程序名称了……)
Bratchley

天哪!您是对的-“ mutex”是我的脚本的名称,因此grepping'mutex'仅适用于我的情况。感谢您指出
Benubird

好象我也做了一个嘘声:“第一个字母字符是打开文件的方式 ……”
Bratchley13年


0

万一系统lsof本身不存在,ls /proc/*/fd/* | grep LOCK_FILE_NAME应提供相同的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.