Что такое файловый дескриптор в Linux?

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

Ответ

Файловый дескриптор (File Descriptor, FD) — это неотрицательное целое число, которое ядро Linux возвращает процессу при открытии любого ресурса ввода-вывода: файла, сетевого сокета, канала (pipe) или устройства. Это низкоуровневый handle для работы через системные вызовы (read, write, close).

Ключевые аспекты для DevOps:

  • Стандартные потоки: У каждого процесса есть три предопределённых FD: 0 (stdin), 1 (stdout), 2 (stderr).
  • Лимиты: Система ограничивает количество FD, которые может открыть один процесс. Проверить и изменить лимит можно командой ulimit -n. Превышение лимита — частая причина ошибок "Too many open files" в высоконагруженных приложениях.
  • Мониторинг: Утилиты lsof (list open files) и ls -la /proc/<PID>/fd/ показывают, какие файлы и сокеты открыты процессом. Это критически важно для диагностики утечек дескрипторов.

Пример диагностики в bash:

# Найти процесс, открывший конкретный файл
lsof /var/log/nginx/access.log

# Посмотреть лимиты для текущей оболочки
ulimit -a

# Посмотреть открытые дескрипторы для процесса с PID 1234
ls -la /proc/1234/fd/

# Посчитать количество открытых сокетов у процесса
lsof -p 1234 | grep -c "SOCK"

Почему это важно: Утечка файловых дескрипторов (когда приложение открывает их, но не закрывает) приводит к исчерпанию лимита, после чего приложение не может открыть новые файлы или сетевые соединения, что вызывает его отказ. В DevOps-практике мы настраиваем мониторинг (например, Prometheus-метрику process_open_fds) и корректные лимиты в systemd-юнитах или контейнерах.