![如何检测Linux中异常长的文件锁?](https://linux22.com/image/632568/%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8BLinux%E4%B8%AD%E5%BC%82%E5%B8%B8%E9%95%BF%E7%9A%84%E6%96%87%E4%BB%B6%E9%94%81%EF%BC%9F.png)
我的 Linux 服务器上有一个争用点。多个进程中的一个进程访问单个文件,并在随机时间将该文件锁定相当长一段时间(>60 秒),这反过来又导致其他事情失败。
有没有办法检测多久文件已被锁定,由哪个进程锁定?
答案1
我认为您要查找的是文件/proc/locks
。它显示系统中的当前文件锁定。这不显示文件被锁定了多长时间,但它显示通过哪个过程。也许您可以检测此文件中何时注册锁并测量经过的时间。示例如下:
cat /proc/locks
1: POSIX ADVISORY WRITE 2245 08:06:1182714 1073741824 1073741824
2: POSIX ADVISORY WRITE 2245 08:06:1182714 1073741826 1073742335
3: POSIX ADVISORY WRITE 3058 08:06:10752740 0 0
4: POSIX ADVISORY WRITE 3058 08:06:10752739 0 0
5: POSIX ADVISORY WRITE 2421 08:06:10752766 0 EOF
6: POSIX ADVISORY WRITE 2421 08:06:11142048 0 EOF
7: POSIX ADVISORY WRITE 2421 08:06:9964366 1073741824 1073742335
8: POSIX ADVISORY WRITE 2421 08:06:11142040 0 EOF
其中列为:
- 第一的: 锁 #。
- 第二:锁类型(如果锁是使用 创建的,则为 POSIX
fcntl
,FLOCK
如果使用 创建的,则为flock
。 - 第三:锁定模式(建议或强制)
- 向前:锁类型(WRITE或READ),对应共享锁或者排他锁。
- 第五:具有锁的进程的 PID。
- 第六:三个数字隔开,用于
:
标识锁定的文件。 - 第七:锁的起始字节。
- 第八:锁的结束字节
答案2
只需查看创建锁文件的时间戳,即可知道该文件有多旧。同样,如果您“cat logfile.name”,它通常会包含创建它的进程 ID 作为其唯一内容。