我有一個非常複雜的Python程序。在內部它有一個使用獨家(LOCK_EX)fcntl.flock來管理全局鎖定的日誌記錄系統。實際上,無論何時轉儲日誌消息,都會獲取全局文件鎖定,將消息發送到文件(與鎖定文件不同),並釋放全局文件鎖定。死亡與羊羣,叉子和終止父進程
該程序還分叉幾次(日誌管理設置後)。 通常一切正常。
如果父進程被殺死(並且孩子活着),我偶爾會遇到死鎖。所有程序永遠都會阻塞fcntl.flock()。嘗試從外部獲取鎖也永遠阻止。我必須殺死兒童方案才能解決問題。
什麼是令人困惑的是,雖然鎖定文件lsof顯示沒有進程作爲持有鎖!所以我不知道爲什麼文件被內核鎖定,但沒有進程被報告爲持有它。
羊羣有分叉問題嗎?即使它不再在進程表中,死鎖父母是否仍然持有該鎖?我該如何着手解決這個問題?
好吧,我切換到fcntl.lockf,它包裝fcntl鎖(而不是flock)。僵局消失了。 – UsAaR33 2012-02-02 06:00:12
我懷疑這是因爲flock會鎖定文件描述符(仍然在子進程中退出),而fcntl使用inode/pid進行鎖定。但奇怪的是,我們沒有解決孩子們真正擁有羊羣的問題,爲什麼會這樣? – UsAaR33 2012-02-02 06:06:43