Как использовать lsof для диагностики открытых файлов и портов
Команда lsof
(list open files) — один из самых полезных инструментов для диагностики в Linux.
Её можно считать «рентгеном» системы: она показывает, какие процессы держат открытые файлы, сокеты и порты, помогает находить утечки, зависшие процессы и причины блокировки устройств.
Что делает lsof
В Linux всё — файл: и текстовый документ, и сетевое соединение, и устройство.
lsof
просматривает таблицу открытых файлов в ядре и показывает, какие процессы что держат открытым.
Это позволяет:
- понять, какой процесс занимает порт;
- выяснить, кто «висит» на удалённом диске;
- найти процесс, мешающий отмонтировать файловую систему;
- отследить утечки файловых дескрипторов.
Установка
На большинстве дистрибутивов lsof
предустановлен. Если нет:
sudo apt install lsof # Debian/Ubuntu
sudo yum install lsof # CentOS/RHEL
sudo dnf install lsof # Fedora
Базовое использование
lsof
Без аргументов команда выведет список всех открытых файлов — их может быть тысячи, поэтому обычно применяют фильтры.
Поиск по порту
Часто lsof
используют для поиска процесса, который занимает порт:
sudo lsof -i :80
Результат покажет, кто слушает 80-й порт (обычно nginx
или apache2
).
Пример вывода:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1420 root 6u IPv4 35789 0t0 TCP *:http (LISTEN)
Поиск по типу соединения
Показать все TCP-соединения:
sudo lsof -i tcp
Показать все UDP:
sudo lsof -i udp
Можно добавить фильтр по хосту:
sudo lsof -i @192.168.1.10
Найти процесс, использующий файл
Если ты хочешь удалить или размонтировать диск, а система отвечает:
device is busy
проверь, кто его держит:
sudo lsof /mnt/backup
или конкретный файл:
sudo lsof /var/log/syslog
Поиск по PID или пользователю
Все файлы, открытые процессом с PID 1234:
sudo lsof -p 1234
Все файлы, открытые пользователем nginx:
sudo lsof -u nginx
Как узнать, кто слушает порты
Аналог netstat -tulnp
, но с подробностями:
sudo lsof -i -P -n | grep LISTEN
-P
— не переводить номера портов в имена (80, а не http);-n
— не резолвить имена хостов (ускоряет работу).
Найти удалённые файлы, которые всё ещё открыты
Иногда лог-файл удалён, но диск всё ещё занят:
sudo lsof | grep deleted
Это поможет понять, какой процесс держит удалённый файл открытым (и почему место не освободилось).
Проверка открытых файлов в каталоге
Если нужно понять, что держит папку:
sudo lsof +D /var/www/html
Важно: +D
рекурсивно сканирует поддиректории — на больших путях может работать медленно.
Диагностика при отмонтировании
Если umount
пишет target is busy:
sudo lsof +f -- /mnt/data
Ты увидишь, какие процессы мешают отмонтировать раздел.
Сравнение с ss и netstat
Утилита | Что делает |
---|---|
lsof | Показывает все открытые файлы, включая сокеты, устройства и обычные файлы |
ss | Отображает только сетевые соединения |
netstat | Устаревшая альтернатива ss |
Если тебе нужно именно «кто слушает порт» — подойдёт и ss
.
Но lsof
гораздо мощнее — он охватывает весь ввод-вывод, не только сеть.
Практическая диагностика: пример
Проблема: сайт не запускается, потому что порт 3000 занят.
Решение:
sudo lsof -i :3000
Вывод:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 2432 user 22u IPv4 120348 0t0 TCP *:3000 (LISTEN)
Завершаем процесс:
kill -9 2432
Порт освобождён.
Полезные комбинации
Все открытые файлы каталогов:
lsof +D /home/user/projects
Все открытые TCP-соединения процесса:
lsof -p $(pidof nginx) -i tcp
Файлы, открытые root:
lsof -u root
Просмотр по типу устройства:
lsof /dev/sda
Заключение
lsof
— незаменимая утилита для диагностики системных проблем.
Она помогает:
- находить процессы, блокирующие файлы и порты,
- отслеживать утечки дескрипторов,
- контролировать сетевую активность и доступ к устройствам.
В отличие от ss
и netstat
, lsof
даёт полный обзор всех открытых объектов — это делает её мощным инструментом администратора при любых непонятных сбоях.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний