4: FLOCK ADVISORY WRITE 274 03:07:81908 0 EOF
Файл /proc/locks хранит информацию о блокировках, созданных с применением вызовов flock() и fcntl(). Каждая запись состоит из восьми полей (слева направо).
1. Порядковый номер в наборе блокировок, удерживаемых для заданного файла (см. подраздел 51.3.4).
2. Тип блокировки. Значения FLOCK указывают на блокировки, созданные с помощью вызова flock(), а POSIX — на те, что созданы с использованием fcntl().
3. Режим блокировки: ADVISORY или MANDATORY.
4. Тип блокировки: READ или WRITE (относится к разделяемым и эксклюзивным блокировкам на основе вызова fcntl()).
5. Идентификатор процесса, удерживающего блокировку.
6. Три числа, разделенные двоеточиями, обозначают файл, для которого удерживается блокировка. Это мажорные и минорные номера устройства в текущей файловой системе, а также индексный дескриптор файла.
7. Начальный байт блокировки. В случае с блокировками на основе вызова flock() данный столбец всегда равен 0.
8. Конечный байт блокировки. Значение EOF показывает, что блокировка доходит до самого конца файла (то есть при вызове fcntl() поле l_len было равно 0). В случае с блокировками, основанными на flock(), этот столбец всегда равен EOF.
С помощью информации из файла /proc/locks можно определить, какими процессами и для каких файлов удерживаются те или иные блокировки. То, как это делается, показано в следующей сессии командной строки на примере блокировки 3 из списка, приведенного выше. Эта блокировка удерживается процессом с идентификатором 312 для индексного дескриптора 133853 на устройстве, чьи мажорный и минорный идентификаторы равны 3 и 7. Для начала воспользуемся командой ps(1), чтобы вывести сведения о процессе, чей PID равен 312:
$ ps — p 312
PID TTY TIME CMD
312? 00:00:00 atd
Как видите, программой, удерживающей блокировку, оказался демон atd, который выполняет пакетные задания по расписанию.
Чтобы найти заблокированный файл, поищем для начала в каталоге /dev устройство с идентификатором 3:7. Им оказался файл /dev/sda7:
$ ls — li /dev/sda7 | awk '$6 == “3,” && $7 == 10'
1311 brw-rw- 1 root disk 3, 7 May 12 2006 /dev/sda7
Теперь определим точку подключения устройства /dev/sda7 и найдем ту часть файловой системы, которой принадлежит индексный дескриптор с номером 133853:
$ mount | grep sda7
/dev/sda7 on / type reiserfs (rw)
$ su
Password:
# find / — mount — inum 133853
/var/run/atd.pid
Параметр — mount не дает команде find заходить в подкаталоги, к которым подключены другие файловые системы.
В завершение выведем содержимое заблокированного файла:
# cat /var/run/atd.pid
Демон atd удерживает блокировку для файла /var/run/atd.pid, содержащего ID процесса, в котором этот демон выполняется. Это делается для того, чтобы не дать запустить больше одного экземпляра программы atd. Такой подход будет рассмотрен в разделе 51.6.
Файл /proc/locks также позволяет получить сведения об отложенных запросах на получение блокировок:
$ cat /proc/locks
1: POSIX ADVISORY WRITE 11073 03:07:436283 100 109
1: — > POSIX ADVISORY WRITE 11152 03:07:436283 100 109
2: POSIX MANDATORY WRITE 11014 03:07:436283 0 9
2: — > POSIX MANDATORY WRITE 11024 03:07:436283 0 9
2: — > POSIX MANDATORY READ 11122 03:07:436283 0 19
3: FLOCK ADVISORY WRITE 10802 03:07:134447 0 EOF
3: — > FLOCK ADVISORY WRITE 10840 03:07:134447 0 EOF
Строки, где сразу после номера блокировки указаны символы — >, представляют собой запросы на получение блокировок с соответствующими номерами. Здесь мы имеем один отложенный запрос на получение блокировки 1 (необязательной, созданной вызовом fcntl()), два отложенных запроса на получение блокировки 2 (строгой, созданной вызовом fcntl()) и один отложенный запрос на получение блокировки 3 (созданной с помощью flock()).
Файл /proc/locks также содержит информацию об аренде файлов, установленной любыми процессами в системе. Аренда файлов — уникальный для Linux механизм, доступный в ядрах версии 2.4 и выше. Когда процесс арендует файл, он получает уведомления (на основе сигналов), если другие процессы пытаются выполнить для данного файла операции open() или truncate() (последняя учитывается, так как это единственный системный вызов, способный изменить содержимое файла, не открывая его). Механизм аренды файлов предоставляется для поддержки уступающих блокировок, применяющихся в протоколе SMB, и для аналогичной системы в протоколе NFS, которая называется делегированием. Больше подробностей об аренде файлов содержится в описании операции F_SETLEASE на странице fcntl(2) руководства.