У меня довольно сложная программа на питоне. Внутри у него есть система ведения журнала, которая использует эксклюзивный (LOCK_EX
) fcntl.flock
для управления глобальной блокировкой. По сути, всякий раз, когда сообщение журнала сбрасывается, устанавливается глобальная блокировка файла, сообщение отправляется в файл (отличный от файла блокировки) и глобальная блокировка файла снимается.
Программа также несколько раз разветвляется (после настройки управления логами). Вообще все работает.
Если родительский процесс убит (а дети остаются в живых), я иногда получаю взаимоблокировку. Все программы блокируются на fcntl.flock()
навсегда. Попытка получить блокировку извне также блокирует навсегда. Я должен убить детские программы, чтобы решить проблему.
Что сбивает с толку, так это то, что lsof lock_file
не показывает процесс, удерживающий блокировку! Поэтому я не могу понять, почему файл заблокирован ядром, но ни о каком процессе не сообщается, что он удерживается.
Есть ли у flock
проблемы с разветвлением? Удерживает ли мертвый родитель блокировку, даже если его больше нет в таблице процессов? Как мне решить эту проблему?