Вики / Процессы
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) # убить держащего порт
См. также
- ss (сокеты и порты) — Сеть
- Процессы (ps, top, kill, nice) — Процессы
- Место на диске (df, du, inode) — Хранилище и ФС