linux-labs

Вики / Процессы

lsof (открытые файлы и порты)

Кто держит файл, порт или удалённый-но-открытый дескриптор.

«В Linux всё — файл»: обычные файлы, сокеты, каналы, устройства. lsof (LiSt Open Files) показывает, какие файлы/сокеты открыты и каким процессом. Часто нужен root.

sudo lsof -i :80                  # кто слушает/держит порт 80
sudo lsof /var/log/app.log        # кто открыл этот файл
sudo lsof -u alice                # что открыл пользователь
Ключ Значение
-i [:порт] сетевые сокеты (опц. по порту/хосту)
-nP без DNS- и port-резолва (быстро, числа)
-p PID файлы конкретного процесса
-c name процессы по имени команды
-u user по пользователю
+D /dir рекурсивно по каталогу (что держит ФС)
+L1 файлы с <1 ссылкой (удалённые-но-открытые)
-t только PID (для скриптов: kill $(lsof -t ...))
sudo lsof -i :5432                # процесс на порту (альтернатива ss)
sudo lsof -i -nP                  # все сетевые сокеты (без резолва)
sudo lsof -iTCP -sTCP:LISTEN -nP  # только слушающие TCP
sudo lsof +D /mnt/data            # кто держит файлы в каталоге (мешает umount)
sudo lsof +L1                     # файлы УДАЛЁННЫЕ, но ещё открытые (едят место!)
sudo lsof -p 1234                 # всё, что открыл процесс 1234
sudo lsof -c nginx                # всё, что открыли процессы nginx
sudo lsof -u alice -a -i          # И пользователь alice, И сеть (-a = AND)
sudo kill $(sudo lsof -t -i:8080) # убить того, кто на порту 8080

df показывает «полно», du — нет

Удалённый, но открытый процессом файл не освобождает место. Найди: sudo lsof +L1 → перезапусти держащий процесс (см. disk-usage).

umount: target is busy

Что-то держит ФС: sudo lsof +D /mnt/data (или fuser -vm /mnt/data). Закрой процессы (или cd из каталога) и отмонтируй (см. mount).

Порт занят, кто — непонятно

sudo lsof -i :PORT -nP или ss -tlnp.

Процесс «утёк» файловыми дескрипторами

sudo lsof -p PID | wc -l — сколько открыто; сравни с лимитом ulimit -n. Постоянный рост = утечка fd в приложении.

lsof долго думает

Резолвит DNS/порты/маунты — добавь -nP, при зависших NFS — может висеть на маунте.

sudo lsof -i :PORT -nP            # кто на порту
sudo lsof +D /dir                 # кто держит каталог (umount busy)
sudo lsof +L1                     # удалённые-но-открытые (место)
sudo lsof -p PID | wc -l          # сколько fd у процесса (утечка?)
sudo kill $(sudo lsof -t -i:PORT) # убить держащего порт

См. также