我有一个相当复杂的Python程序。它内部有一个日志记录系统,使用一个独占(LOCK_EX
)fcntl.flock
来管理全局锁定。实际上,每当一个日志消息被转储时,都会获得全局文件锁,将消息发送到文件(不同于锁定文件),然后释放全局文件锁。
该程序在设置日志管理后也会多次进行自我复制。通常一切正常。
如果父进程被kill掉(而子进程保持存活状态),偶尔会出现死锁。所有程序都永远地阻塞在 fcntl.flock()
上。尝试外部获取锁定同样永远地阻塞。我必须kill掉子进程才能解决这个问题。
但令人困惑的是,lsof lock_file
并没有显示任何持有锁的进程!因此,我无法弄清楚为什么文件被内核锁定,但没有进程报告它正在持有锁定。
flock
在分叉方面是否存在问题?即使已不在进程表中,死亡的父级是否仍在持有锁定?如何解决这个问题?