2012-02-02 90 views
4

我有一個非常複雜的Python程序。在內部它有一個使用獨家(LOCK_EX)fcntl.flock來管理全局鎖定的日誌記錄系統。實際上,無論何時轉儲日誌消息,都會獲取全局文件鎖定,將消息發送到文件(與鎖定文件不同),並釋放全局文件鎖定。死亡與羊羣,叉子和終止父進程

該程序還分叉幾次(日誌管理設置後)。 通常一切正常。

如果父進程被殺死(並且孩子活着),我偶爾會遇到死鎖。所有程序永遠都會阻塞fcntl.flock()。嘗試從外部獲取鎖也永遠阻止。我必須殺死兒童方案才能解決問題。

什麼是令人困惑的是,雖然鎖定文件lsof顯示沒有進程作爲持有鎖!所以我不知道爲什麼文件被內核鎖定,但沒有進程被報告爲持有它。

羊羣有分叉問題嗎?即使它不再在進程表中,死鎖父母是否仍然持有該鎖?我該如何着手解決這個問題?

+0

好吧,我切換到fcntl.lockf,它包裝fcntl鎖(而不是flock)。僵局消失了。 – UsAaR33 2012-02-02 06:00:12

+0

我懷疑這是因爲flock會鎖定文件描述符(仍然在子進程中退出),而fcntl使用inode/pid進行鎖定。但奇怪的是,我們沒有解決孩子們真正擁有羊羣的問題,爲什麼會這樣? – UsAaR33 2012-02-02 06:06:43

回答

1

lsof幾乎可以肯定不會顯示flock()鎖,所以沒有人會告訴你是否有一個鎖。

flock()鎖通過FD-共享(dup()系統調用,或叉和高管離開打開文件)以及任何與共享描述符可以解除鎖定繼承的,但如果鎖已經被持有,任何企圖再次鎖定會阻止。所以,是的,很可能是父母鎖定了描述符,然後死了,而描述符被鎖定。子進程然後嘗試鎖定並阻止,因爲描述符已被鎖定。 (如果子進程鎖定文件,則死亡也是如此。)

由於`fcntl()'鎖是每個進程,死亡進程將釋放所有鎖,以便繼續執行,這就是你想在這裏。