Как определить, какие файлы открыты процессом в Linux?

«Как определить, какие файлы открыты процессом в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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 для отслеживания тенденций и настройки алертов на аномальный рост.