UsA*_*R33 6 python fork locking flock fcntl
我有一个非常复杂的python程序。在内部,它具有使用独占(LOCK_EX)fcntl.flock来管理全局锁定的日志记录系统。实际上,每当转储日志消息时,都会获取全局文件锁,将消息发射到文件(与锁定文件不同),然后释放全局文件锁。
该程序还将自身分叉几次(在设置日志管理之后)。通常,一切正常。
如果父进程被杀死(孩子仍然活着),我偶尔会陷入僵局。所有程序都永远在fcntl.flock()上阻塞。试图从外部获取锁也会永远受阻。我必须杀死儿童程序才能解决此问题。
令人困惑的是lsof lock_file没有显示任何持有该锁的进程!因此,我无法弄清楚为什么文件被内核锁定了,但是没有进程被报告为持有该文件。
羊群叉有问题吗?即使死进程的父进程不再在进程表中,死去的父进程是否仍以某种方式持有该锁?我该如何解决这个问题?
lsof几乎可以肯定,只是没有显示flock()锁,因此看不到锁并不能告诉您是否存在锁。
flock()锁是通过 fd 共享(dup()系统调用,或使文件保持打开状态的 fork-and-exec)继承的,任何拥有共享描述符的人都可以解锁锁,但如果锁已经被持有,任何再次锁定它的尝试都将被阻止。所以,是的,父级很可能锁定了描述符,然后死亡,使描述符保持锁定。然后子进程也尝试锁定并阻塞,因为描述符已经被锁定。(如果子进程锁定文件然后死亡,也会发生同样的情况。)
由于“fcntl()”锁是每个进程的锁,垂死的进程会释放其所有锁,以便您可以继续,这就是您想要的。
| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |