Как перечислить процессы блокировки файла?


51

При использовании flockнесколько процессов могут иметь общую блокировку одновременно или могут ожидать блокировки записи. Как мне получить список этих процессов?

То есть, для данного файла X, в идеале, найти идентификатор процесса каждого процесса, который либо удерживает, либо ожидает блокировку файла. Это было бы очень хорошее начало, хотя бы просто подсчитать количество процессов, ожидающих блокировки.

Ответы:


42

lslocksиз пакета util-linux делает именно это.

В MODEстолбце процессы, ожидающие блокировки, будут помечены знаком *.


3
Apt-cache говорит, что util-linux уже является новейшей версией (2.20.1-1ubuntu3), но у меня нет lslocks; могу ли я использовать репо, которое мне это даст?
Benubird

2
Похоже, это было добавлено в 2.22, поэтому версия Ubuntu слишком старая. Предположительно новая версия будет доступна в конце концов. (Это также относится и к RHEL 6 или CentOS.) Вы можете создать его самостоятельно или использовать lsofподход, предложенный Джоэлем Дэвисом.
Mattdm

6
lslocksчитает /proc/locks, в крайнем случае, вы можете прочитать это непосредственно сами, с оговоркой, что файлы идентифицируются по устройству и inode, а не по имени. Поскольку вы знаете файл, это не должно быть проблемой. Заблокированные записи имеют ->префикс перед столбцом типа блокировки (таким образом, добавляя столбец к этой строке).
mr.spuratic

27

Две возможности: lsof(мое предпочтение) или lslk(специально для блокировки файлов):

[root@policyServer ~]# lslk | grep "master.lock"
SRC          PID   DEV  INUM   SZ TY M   ST WH  END LEN NAME
master      1650 253,0 12423   33  w 0    0  0    0   0 /var/lib/postfix/master.lock

[root@policyServer ~]# lsof | grep "master.lock"
master     1650      root   10uW     REG              253,0       33      12423 /var/lib/postfix/master.lock

Вывод lslk является саморасширяющимся, но lsofпомещает описание блокировки в столбец «FD» (который находится 10uWвыше). Со страницы руководства:

The mode character is followed by one of these lock characters, describing the type of lock applied to the file:

N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part      of the file;
X for an SCO OpenServer Xenix lock on the      entire file;
                       space if there is no lock.

Таким образом, столбец «FD» lsofвыше разбит на:

10Дословный дескриптор этого открытого файла. Что связано с/proc/1650/fd/10

u Файл открыт для чтения и записи

W Программа имеет блокировку записи в файл.


1
Я не могу найти, где взять lslk, и, похоже, он больше не поддерживается. Стоит также отметить, что если вы хотите, чтобы lsof показывал только процессы, которые фактически блокируют файл, вам нужно использовать grep для «^ mutex». Он также не различает «удержание» и «блокирование».
Benubird

Первая буква в поле FD - это файл, в котором она открыта (я полагаю, это то, что вы имеете в виду, удерживая), необязательный второй символ - это блокировка (если есть), которую он имеет для файла (который я ' я предполагаю, что вы подразумеваете под "блокировкой") Также flock! = мьютекс. Ваш grep пропустил бы блокировки, подобные той, что в посте (не говоря уже о том, что первое поле - это имя программы ...)
Bratchley

D'о! Вы правы - «mutex» был названием моего сценария, поэтому выражение «mutex» применимо только к моему случаю. Спасибо за указание на это
Benubird

похоже, я тоже сделал бу-бу: «первая буква - это режим , в котором файл открывается ...»
Братчли,


0

в случае, если lsofсам отсутствует в системе, ls /proc/*/fd/* | grep LOCK_FILE_NAMEследует предоставить ту же информацию.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.