死锁,带有羊群,叉子和终止父进程

问题描述 投票:6回答:1

我有一个非常复杂的python程序。在内部,它具有使用独占(LOCK_EXfcntl.flock来管理全局锁定的日志记录系统。实际上,每当转储日志消息时,都会获取全局文件锁,将消息发射到文件(与锁定文件不同),然后释放全局文件锁。

该程序也会自我分叉几次(在设置日志管理之后)。通常,一切正常。

如果父进程被杀死(孩子们还活着),我偶尔会陷入僵局。所有程序永远在fcntl.flock()上阻塞。试图从外部获取锁也会永远受阻。我必须杀死儿童程序才能解决此问题。

尽管令人困惑的是,lsof lock_file没有显示任何持有锁的过程!因此,我无法弄清楚为什么文件被内核锁定了,但是没有任何报告将其保存。

flock分叉有问题吗?即使死进程的父进程不再在进程表中,它是否仍会以某种方式持有该锁?我该如何解决这个问题?

python locking fork fcntl flock
1个回答
3
投票

[lsof几乎可以肯定只是不显示flock()锁,因此看不到任何信息就不会告诉您是否有一个。

[flock()]锁是通过fd共享(dup()系统调用,或使文件保持打开状态的fork-and-exec)继承的,拥有共享描述符的任何人都可以解锁该锁,但是如果该锁已被持有,任何再次锁定它的尝试都会阻止。因此,是的,父对象很可能锁定了描述符,然后死亡,从而使描述符保持锁定状态。然后,子进程也尝试锁定并阻塞,因为描述符已被锁定。 (如果子进程将文件锁定然后死亡,也会发生同样的情况。)

由于`fcntl()'锁是按进程的,即将死去的进程会释放其所有锁,因此您可以继续进行操作,这就是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.