← Назад к вопросам

Как посмотреть с какими файлами работает программа на linux в данный момент

2.0 Middle🔥 181 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отличный вопрос! Он затрагивает одну из ключевых задач мониторинга и диагностики в Linux — отслеживание активности процессов в реальном времени. Для решения этой задачи существует несколько мощных инструментов, выбор которых зависит от глубины требуемого анализа.

Основные инструменты для мониторинга файловых дескрипторов

В Linux всё является файлом: обычные файлы, сетевые сокеты, каналы, устройства. Поэтому программа работает не с "файлами" в бытовом смысле, а с файловыми дескрипторами (FD — File Descriptors). Вот основные команды для их просмотра.

1. lsof (List Open Files) — самый мощный и универсальный инструмент

Это основная команда для решения вашей задачи. Она выводит список всех открытых файлов в системе или для конкретного процесса.

Базовое использование для процесса:

# Найти PID (ID процесса) программы, если он неизвестен
pgrep -f "имя_программы"
# или
pidof имя_программы

# Показать все открытые файлы для процесса с PID 1234
lsof -p 1234

Полезные флаги и примеры:

# Следить за открытием файлов в реальном времени (очень полезно для диагностики)
lsof -p 1234 +r 2

# Показать все открытые файлы определенного типа (например, обычные файлы REG или сетевые IPv4)
lsof -p 1234 -d ^txt,^mem  # Исключить текстовые и memory-mapped файлы

# Узнать, какая программа держит открытым конкретный файл или каталог
lsof /путь/к/файлу
lsof +D /путь/к/каталогу

2. ls -la /proc/<PID>/fd — прямое обращение к виртуальной файловой системе /proc

Это "низкоуровневый" способ, показывающий, как именно ядро Linux предоставляет информацию о процессах. Каждый файловый дескриптор представлен здесь символьной ссылкой.

# Просмотр дескрипторов процесса 1234
ls -l /proc/1234/fd

# Более читабельный вывод с сортировкой
ls -lh /proc/1234/fd | sort -k9

Интерпретация вывода:

  • 0, 1, 2 — стандартные потоки: stdin, stdout, stderr.
  • 3, 4, 5... — дескрипторы, открытые программой.
  • Символьная ссылка (например, /var/log/app.log или socket:[<номер>]) указывает на реальный ресурс.

3. strace / ltrace — трассировка системных вызовов и библиотечных функций в реальном времени

Эти инструменты показывают не просто список открытых файлов, а динамику работы — какие файлы открываются, читаются, записываются и закрываются прямо сейчас.

# Трассировка всех системных вызовов, связанных с файлами (open, openat, read, write, close)
strace -e trace=file -p 1234

# Трассировка только операций открытия файлов
strace -e trace=open,openat -p 1234

# Для анализа работы с динамическими библиотеками
ltrace -e 'fopen;fclose;fread;fwrite' -p 1234

Практическая стратегия диагностики

Вот как я, как DevOps-инженер, подхожу к такому запросу в реальной ситуации:

  1. Идентификация процесса:

    # Если имя известно
    pid=$(pgrep -f "nginx" | head -1)
    # Если нет — ищем по порту или строке в командной строке
    lsof -i :80
    
  2. Базовый анализ:

    # Сначала смотрю общую картину: сколько и какие дескрипторы открыты
    lsof -p $pid | head -20
    ls -l /proc/$pid/fd | wc -l  # Быстрый подсчёт количества
    
  3. Глубокий анализ при проблемах (утечка дескрипторов, высокая нагрузка на диск):

    # Поиск "утекающих" дескрипторов — слежу за ростом их числа
    watch -n 1 'ls /proc/$pid/fd | wc -l'
    
    # Запуск трассировки в фоне с сохранением в лог для последующего анализа
    strace -f -e trace=open,openat -p $pid -o /tmp/strace.log &
    
  4. Анализ сетевой активности (ведь сокеты — это тоже файлы):

    lsof -p $pid -i  # Только сетевые соединения
    lsof -p $pid -iTCP  # Только TCP
    

Ключевые моменты для понимания

  • Типы файлов в выводе lsof: Обращайте внимание на столбец TYPE.
    * `REG` — обычный файл.
    * `DIR` — каталог.
    * `CHR`, `BLK` — символьные и блочные устройства.
    * `FIFO` — именованный канал.
    * `unix`, `IPv4`, `IPv6` — сетевые сокеты.
  • Утечка файловых дескрипторов: Если число в /proc/<PID>/fd постоянно растёт — это классическая проблема "утечки". При достижении лимита (ulimit -n) программа аварийно завершится. Для диагностики такой проблемы strace с фильтром по open/close незаменим.
  • Контекст безопасности: Для просмотра файлов процессов других пользователей обычно требуются права root.

Для быстрого ответа на вопрос "что происходит прямо сейчас?" я чаще всего начинаю с комбинации lsof -p <PID> и ls -l /proc/<PID>/fd. Если нужна динамика — перехожу к strace. В сценариях автоматизации (например, для мониторинга) данные из /proc удобнее парсить.

Как посмотреть с какими файлами работает программа на linux в данный момент | PrepBro