Як перелічити файл блокування процесів?


51

Використовуючи flock, кілька процесів можуть мати загальний замок одночасно або чекати, щоб придбати блокування запису. Як отримати список цих процесів?

Тобто для заданого файлу X ідеально знайти ідентифікатор процесу кожного процесу, який або містить, або чекає, блокування у файлі. Було б дуже вдалий початок, хоча просто підрахувати кількість процесів, які очікують блокування.

Відповіді:


42

lslocks, з пакету util-linux робить саме це.

У MODEстовпці процеси, які очікують блокування, будуть позначені знаком a *.


3
Apt-кеш говорить, що 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 відображав лише ті процеси, які фактично блокують файл, вам потрібно простукувати за "^ mutex". Він також не розрізняє "тримання" та "блокування".
Benubird

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

D'oh! Ви маєте рацію - "mutex" так називали мій сценарій, тому прив'язка до "mutex" стосується лише мого випадку. Дякуємо, що
вказали на це

добре виглядає, що я теж зробив бу-бу: "Перший символ букви - це режим , у якому файл відкрито ..."
Bratchley

5

lsof може допомогти переглянути список файлів. ось спосіб переглянути заблоковані файли.

sudo lsof /var/lib/dpkg/lock 

0

у випадку, якщо lsofв системі відсутній сам, ls /proc/*/fd/* | grep LOCK_FILE_NAMEслід надати ту саму інформацію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.