Ответ
В DevOps задача часто сводится к поиску утечки файловых дескрипторов, блокировок файлов или анализу того, почему процесс не может получить доступ к ресурсу. Основной инструмент — lsof (List Open Files).
Базовое использование:
# 1. Найти PID процесса
pgrep nginx # или `ps aux | grep nginx`
# Предположим, PID = 1234
# 2. Показать все открытые файлы, сокеты и каталоги для процесса
lsof -p 1234
# 3. Более читаемый вывод с заголовками
lsof -p 1234 | head -20
Практические сценарии и команды:
- Что держит открытым лог-файл, который нужно ротировать?
lsof /var/log/nginx/access.log - Какой процесс слушает порт 80 или 443?
lsof -i :80 lsof -i :443 - Почему не удается размонтировать файловую систему (device is busy)?
lsof /mnt/data # Покажет все процессы, использующие файлы в этой точке монтирования - Диагностика утечки файловых дескрипторов:
# Показать количество открытых файловых дескрипторов для каждого процесса lsof -n | awk '{print $1, $2}' | sort | uniq -c | sort -nr | head # Проверить лимит для конкретного процесса cat /proc/1234/limits | grep 'Max open files'
Альтернативы и продвинутые методы:
- Использование
/procфайловой системы (более низкоуровнево):ls -la /proc/1234/fd/ # Список открытых файловых дескрипторов процесса readlink /proc/1234/fd/3 # Узнать, на что ссылается дескриптор 3 - Поиск процессов, открывших удаленный файл по NFS/SMB:
lsof | grep '/mnt/nfs_share' # Может помочь найти проблемный процесс - Мониторинг в реальном времени: Для отслеживания открытия/закрытия файлов можно использовать
fatraceилиinotifywait.
Интеграция в DevOps-практики:
- Скрипты для очистки: Написание скриптов, которые принудительно закрывают файловые дескрипторы у "зависших" процессов перед деплоем или ротацией логов.
- Мониторинг: Сбор метрики
process_open_fdsчерез Prometheus Node Exporter для отслеживания тенденций и настройки алертов на аномальный рост.