# lsof - кто что открыл _Команды · LinuxLab Knowledge Base_ **TL;DR:** `lsof` (List Open Files) показывает все открытые файлы по всем процессам. В Linux всё - файл, поэтому это и обычные файлы, и сокеты, и pipe'ы. ## Зачем Когда нужно ответить на вопросы: - «Какой процесс держит этот порт?» - «Кто захватил этот файл и не отпускает?» - «Почему диск full если `du` показывает мало?» `lsof` - главный ответчик. Без `sudo` показывает только твои процессы; с `sudo` - все. ## Самые ходовые формы ```bash lsof -p 1234 # все fd конкретного [process-and-pid](/kb/process-and-pid.md) lsof -i # все сетевые сокеты lsof -i :8080 # кто слушает или связан с портом 8080 lsof -i tcp # только TCP lsof -nP -i # без resolv: -n не резолвить хосты, -P не резолвить порты lsof /var/log/app.log # кто открыл этот конкретный файл lsof +D /var/lib/docker # все открытые внутри директории (-D = recurse) ``` ## Самый полезный one-liner: lsof | grep deleted Когда `df -h` показывает full, а `du -sh /` - нет: ```bash sudo lsof | grep deleted ``` Это процессы которые **держат открытым** файл, удалённый из ФС. Inode жив пока fd не закроется. Самый частый виновник - приложение с ротацией логов которое забыло переоткрыть лог-файл. ## Колонки в выводе ``` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 900 www 6u IPv4 12345 0t0 TCP *:80 (LISTEN) ``` - **FD**: число + тип. `6u` - fd 6, открыт на read+write. `cwd`, `rtd`, `txt`, `mem` - спецтипы (cwd = текущая директория, txt = бинарь, mem = mmap) - **TYPE**: `REG` (файл), `DIR`, `CHR` (char device), `IPv4`/`IPv6`, `unix`, `FIFO` - **NAME**: путь либо `host:port → host:port` для сокетов ## Альтернатива через /proc Без `lsof` то же видно через `/proc//fd/*`: ```bash ls -l /proc/900/fd/ # каждый fd - symlink на цель ``` `lsof` это просто удобный агрегатор того же. ## Команды ```bash lsof -p $(pgrep -x nginx) ``` Все открытые файлы конкретного процесса ```bash sudo lsof -i :8080 ``` Кто слушает или подключён к порту 8080 ```bash sudo lsof | grep deleted ``` Удалённые-но-открытые файлы - кандидаты на «диск загадочно full» ```bash lsof -nP -i tcp ``` Все TCP-соединения системы без резолва имён ```bash lsof -t -i :8080 | xargs -r kill ``` Прибить все процессы держащие порт 8080 (-t = только PID) ## См. также - [ps - снимок процессов](/kb/cmd-ps.md) - [htop - интерактивный монитор процессов](/kb/cmd-htop.md) - [strace - какие syscall'ы делает процесс](/kb/cmd-strace.md) - [lsblk и blkid - block-устройства и UUID](/kb/cmd-lsblk-blkid.md) - [File descriptors (stdin, stdout, stderr)](/kb/file-descriptors.md) - [ss - кто слушает и кто подключён](/kb/cmd-ss.md)