我有一个非常复杂的python程序。在内部,它有一个使用独占(LOCK_EX) fcntl.flock来管理全局锁定的日志记录系统。实际上,每当日志消息被转储时,都会获取全局文件锁,将消息发送到文件(与锁文件不同),并释放全局文件锁。
该程序还会多次派生自身(在设置日志管理之后)。一般来说,一切都会正常工作。
如果父进程被杀死(而子进程还活着),我偶尔会得到一个死锁。所有程序都会在fcntl.flock()上永久阻塞。尝试从外部获取锁也会永远阻塞。我不得不终止儿童程序来解决这个问题。
然而,令人费解的是,lsof lock_file没有显示持有锁的进程!所以我不知道为什么这个文件被内核锁住了,但是没有任何进程被报告为持有它。
flock在分叉方面有问题吗?死的父级是否以某种方式持有锁,即使它不再在进程表中?我该如何解决这个问题呢?
发布于 2012-03-09 09:50:00
几乎可以肯定的是,lsof没有显示flock()锁,所以看不到锁并不能说明是否存在锁。
flock()锁是通过fd-sharing (dup()系统调用,或使文件保持打开状态的fork- and -exec )继承的,任何具有共享描述符的人都可以解锁该锁,但如果该锁已被持有,则任何再次锁定它的尝试都将被阻止。所以,是的,很可能是父级锁定了描述符,然后死了,让描述符保持锁定状态。子进程随后也会尝试锁定并阻塞,因为描述符已经锁定。(如果子进程锁定文件,然后终止,也会发生同样的情况。)
因为` `fcntl()‘锁是针对每个进程的,所以快死的进程会释放它的所有锁,这样您就可以继续了,这就是您在这里想要的。
https://stackoverflow.com/questions/9106997
复制相似问题