
У меня есть спорный момент на моем сервере Linux. Один из нескольких процессов обращается к одному файлу и блокирует файл в случайное время на значительный период (>60 секунд), что, в свою очередь, приводит к сбою других вещей.
Есть ли способ обнаружитьсколькофайл был заблокирован и каким процессом?
решение1
Я думаю, что вы ищете файл /proc/locks
. Он показывает текущие блокировки файлов в системе. Это не показываеткак долго файл был заблокирован, но это показываеткаким процессом. Возможно, вы могли бы определить, когда блокировка регистрируется в этом файле, и измерить прошедшее время. Пример такой:
cat /proc/locks
1: POSIX ADVISORY WRITE 2245 08:06:1182714 1073741824 1073741824
2: POSIX ADVISORY WRITE 2245 08:06:1182714 1073741826 1073742335
3: POSIX ADVISORY WRITE 3058 08:06:10752740 0 0
4: POSIX ADVISORY WRITE 3058 08:06:10752739 0 0
5: POSIX ADVISORY WRITE 2421 08:06:10752766 0 EOF
6: POSIX ADVISORY WRITE 2421 08:06:11142048 0 EOF
7: POSIX ADVISORY WRITE 2421 08:06:9964366 1073741824 1073742335
8: POSIX ADVISORY WRITE 2421 08:06:11142040 0 EOF
Где находятся столбцы:
- Первый: замок #.
- Второй: тип блокировки (POSIX, если блокировка была создана с помощью,
fcntl
иFLOCK
если создана с помощьюflock
. - Третий: режим блокировки (РЕКОМЕНДАТЕЛЬНЫЙ или ОБЯЗАТЕЛЬНЫЙ)
- Вперед: Тип блокировки (ЗАПИСЬ или ЧТЕНИЕ), соответствующий общей или исключительной блокировке.
- Пятый: PID процесса с блокировкой.
- Шестой: Три числа, разделенные цифрой
:
, идентифицирующей заблокированный файл. - Седьмой: Начальный байт блокировки.
- Восьмой:Конечный байт блокировки
решение2
Вы можете узнать, насколько стар файл блокировки, просто посмотрев на временную метку, когда он был создан. Аналогично, если вы "cat logfile.name", он очень часто будет иметь в качестве своего единственного содержимого идентификатор процесса, который его создал.