При использовании flock
несколько процессов могут иметь общую блокировку одновременно или могут ожидать блокировки записи. Как мне получить список этих процессов?
То есть, для данного файла X, в идеале, найти идентификатор процесса каждого процесса, который либо удерживает, либо ожидает блокировку файла. Это было бы очень хорошее начало, хотя бы просто подсчитать количество процессов, ожидающих блокировки.
lsof
подход, предложенный Джоэлем Дэвисом.lslocks
читает/proc/locks
, в крайнем случае, вы можете прочитать это непосредственно сами, с оговоркой, что файлы идентифицируются по устройству и inode, а не по имени. Поскольку вы знаете файл, это не должно быть проблемой. Заблокированные записи имеют->
префикс перед столбцом типа блокировки (таким образом, добавляя столбец к этой строке).Две возможности:
lsof
(мое предпочтение) илиlslk
(специально для блокировки файлов):Вывод lslk является саморасширяющимся, но
lsof
помещает описание блокировки в столбец «FD» (который находится10uW
выше). Со страницы руководства:Таким образом, столбец «FD»
lsof
выше разбит на:10
Дословный дескриптор этого открытого файла. Что связано с/proc/1650/fd/10
u
Файл открыт для чтения и записиW
Программа имеет блокировку записи в файл.источник
flock
! = мьютекс. Ваш grep пропустил бы блокировки, подобные той, что в посте (не говоря уже о том, что первое поле - это имя программы ...)lsof может помочь увидеть список файлов. вот способ увидеть заблокированные файлы.
источник
в случае, если
lsof
сам отсутствует в системе,ls /proc/*/fd/* | grep LOCK_FILE_NAME
следует предоставить ту же информацию.источник