Тупик с флокированием, разветвлением и завершением родительского процесса - PullRequest
5 голосов
/ 02 февраля 2012

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

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

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

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

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

1 Ответ

2 голосов
/ 09 марта 2012

lsof почти наверняка просто не показывает flock() блокировок, поэтому, если вы не видите, никто ничего не говорит о том, существует ли он.

flock() блокировки наследуются через fd-share (dup() системный вызов или fork-and-exec, который оставляет файл открытым), и любой пользователь с общим дескриптором может разблокировать блокировку, но если блокировка уже удержана любая попытка заблокировать его снова заблокирует. Так что, да, вполне вероятно, что родитель заблокировал дескриптор, а затем умер, оставив дескриптор заблокированным. Затем дочерний процесс пытается также заблокировать и блокирует, потому что дескриптор уже заблокирован. (То же самое произошло бы, если бы дочерний процесс заблокировал файл, а затем умер.)

Поскольку блокировки `fcntl () 'для каждого процесса, процесс умирания снимает все свои блокировки, так что вы можете продолжить, что вам и нужно.

...