我有一个非常复杂的python程序。在内部,它有一个使用独占(LOCK_EX
)fcntl.flock
来管理全局锁定的日志记录系统。实际上,每当转储日志消息时,都会获取全局文件锁,将消息发送到文件(与锁文件不同),并释放全局文件锁。
该程序还多次分叉(在设置日志管理之后)。一般来说,一切正常。
如果父进程被终止(而子进程仍然存在),我偶尔会遇到死锁。所有程序将永远阻塞在fcntl.flock()
上。试图从外部获取锁也会永远阻塞。我必须取消儿童节目来解决这个问题。
然而,令人困惑的是,lsof lock_file
没有显示持有锁的过程!所以我不明白为什么内核锁定了这个文件,但没有任何进程被报告为持有它
flock
是否存在分叉问题?死亡的父级是否以某种方式持有锁,即使它不再在流程表中?我该如何解决这个问题?
lsof
几乎可以肯定只是没有显示flock()
锁,所以看不到一个锁告诉是否有一个锁。
flock()
锁是通过fd共享(dup()
系统调用,或保持文件打开的fork和exec)继承的,任何具有共享描述符的人都可以解锁锁,但如果锁已经被持有,任何再次锁定它的尝试都将被阻止。所以,是的,很可能是父对象锁定了描述符,然后死亡,使描述符被锁定。然后,子进程也会尝试锁定并阻止,因为描述符已经被锁定。(如果子进程锁定了文件,然后死亡,也会发生同样的情况。)
由于"fcntl()"锁是每个进程的,所以垂死的进程会释放其所有锁,这样您就可以继续操作,这正是您想要的。