Иногда нужно ответить на очень простой вопрос: кто это держит? Файл удалили, а место не освободилось. Порт занят, но непонятно кем. Диск не размонтируется, потому что "device is busy". Во всех этих случаях помогает
lsof - утилита, которая показывает открытые файлы. В linux почти все является файлом: обычные файлы, сокеты, сетевые соединения, устройства, точки монтирования. Поэтому lsof умеет находить очень много полезного.▪️ Установка:
apt install lsof
#или
yum install lsof```
▪️ Кто держит конкретный файл
lsof /var/log/app.log
Так можно увидеть процесс, PID и пользователя, который открыл файл. Особенно полезно, когда файл уже удалили, но место на диске не вернулось:
lsof | grep deleted
или аккуратнее:
lsof +L1
Это покажет открытые файлы, у которых уже нет ссылок в файловой системе.
Типичный виновник - сервис, который продолжает писать в старый лог после удаления или неудачной ротации.
▪️ Кто слушает порт. Например, нужно понять, кто занял 8080:
lsof -i :8080
Для TCP:
lsof -iTCP:8080 -sTCP:LISTEN
В выводе будет видно имя процесса, PID и пользователь. Это удобно, когда сервис не стартует с ошибкой вроде: address already in use
▪️ Кто держит точку монтирования. Допустим, не получается размонтировать диск:
umount /mnt/backup
А в ответ: target is busy
Смотрим, кто держит файлы внутри:
lsof +D /mnt/backup
После этого можно понять, какой процесс мешает размонтированию: shell с текущей директорией внутри mount point, backup-скрипт, rsync, база или зависший процесс.
▪️ Кто держит сетевые соединения. Показать все сетевые соединения:
lsof -i
Только TCP:
lsof -iTCP
Только UDP:
lsof -iUDP
Это не всегда замена ss, но часто удобно, когда нужно быстро связать соединение с процессом.
▪️ Что полезно запомнить:
lsof /path/to/file
lsof -i :PORT
lsof -iTCP:PORT -sTCP:LISTEN
lsof +D /mount/path
lsof +L1
#linux #lsof
🧑💻 NetworkAdmin