Тупик с flock, fork и завершающим родительским процессом

У меня довольно сложная программа на Python. Внутри у него есть система регистрации, которая использует эксклюзивный (LOCK_EX) fcntl.flock для управления глобальной блокировкой. Фактически, всякий раз, когда сбрасывается сообщение журнала, устанавливается глобальная блокировка файла, в файл отправляется сообщение (отличное от файла блокировки) и снимается глобальная блокировка файла.

Программа также выполняет несколько разветвлений (после настройки управления журналами). В общем все работает.

Если родительский процесс убит (а дети останутся в живых), я иногда захожу в тупик. Все программы блокируются на fcntl.flock () навсегда. Попытка получить блокировку извне также блокирует навсегда. Я должен убить детские программы, чтобы решить проблему.

Что сбивает с толку, так это то, что lsof lock_file не показывает ни одного процесса, удерживающего блокировку! Поэтому я не могу понять, почему файл блокируется ядром, но не сообщается, что процесс удерживает его.

Есть ли у стаи проблемы с раздвоением? Мертвый родитель каким-то образом удерживает блокировку, хотя ее больше нет в таблице процессов? Как мне решить эту проблему?

6
задан UsAaR33 2 February 2012 в 03:59
поделиться