lsof - кто держит порт и открыл тот файл
Ситуация: пытаетесь запустить сервер, а он падает с "Address already in use". Порт занят, но кем? Или пытаетесь удалить файл, а система пишет "file is in use". Кто его держит?
lsof (List Open Files) отвечает на оба вопроса. В Linux «всё есть файл» - сетевые сокеты, пайпы, устройства, обычные файлы. lsof показывает, какие процессы какие «файлы» открыли.
Вариант 1 (Кто занял порт): классический кейс с запуском сервера.
# Кто слушает 3000 порт?
lsof -i :3000
# Вывод: COMMAND PID USER FD NAME
# node 1234 user 23u IPv4 TCP *:3000 (LISTEN)
Вариант 2 (Какой процесс держит файл): не даёт удалить папку или файл.
# Кто использует файл лога?
lsof /var/log/app.log
# Кто работает в папке /home/user/project?
lsof +D /home/user/project
Вариант 3 (Все открытые файлы процесса): подозреваете конкретный процесс - смотрите, что он делает.
# Все файлы, открытые процессом с PID 1234
lsof -p 1234
# Сеть, которую использует процесс
lsof -p 1234 -i
Вариант 4 (Кто использует удалённый файл): монтирование не отдаёт, а кто мешает?
# Процессы, использующие файлы на смонтированном диске
lsof /mnt/usb
# Обычно это оболочка, которая "стоит" в папке на этом диске
lsof нужен, когда обычные инструменты молчат. Команда не показывает ошибку, но что-то мешает. lsof показывает «что именно» и «кто».
Альтернатива:
# Когда точно знаем, что ищем сетевой порт. Быстрее и чаще установлена по умолчанию.
ss -tlnp | grep 3000
lsof выручает, когда:
1. Нужно посмотреть не только TCP, но и UDP
2. Проблема не с портом, а с файлом или папкой
3. Хотите увидеть все соединения процесса целиком
P.S. Самый частый сценарий: lsof -i :8080 - видим PID - kill -9 PID. Всё, порт свободен.
👉🏻 Я в Telegram - t.me/helcode
👉🏻 Я в VK - vk.com/helcode
👉🏻 Я на Boosty - boosty.to/helcode
Ситуация: пытаетесь запустить сервер, а он падает с "Address already in use". Порт занят, но кем? Или пытаетесь удалить файл, а система пишет "file is in use". Кто его держит?
lsof (List Open Files) отвечает на оба вопроса. В Linux «всё есть файл» - сетевые сокеты, пайпы, устройства, обычные файлы. lsof показывает, какие процессы какие «файлы» открыли.
Вариант 1 (Кто занял порт): классический кейс с запуском сервера.
# Кто слушает 3000 порт?
lsof -i :3000
# Вывод: COMMAND PID USER FD NAME
# node 1234 user 23u IPv4 TCP *:3000 (LISTEN)
Вариант 2 (Какой процесс держит файл): не даёт удалить папку или файл.
# Кто использует файл лога?
lsof /var/log/app.log
# Кто работает в папке /home/user/project?
lsof +D /home/user/project
Вариант 3 (Все открытые файлы процесса): подозреваете конкретный процесс - смотрите, что он делает.
# Все файлы, открытые процессом с PID 1234
lsof -p 1234
# Сеть, которую использует процесс
lsof -p 1234 -i
Вариант 4 (Кто использует удалённый файл): монтирование не отдаёт, а кто мешает?
# Процессы, использующие файлы на смонтированном диске
lsof /mnt/usb
# Обычно это оболочка, которая "стоит" в папке на этом диске
lsof нужен, когда обычные инструменты молчат. Команда не показывает ошибку, но что-то мешает. lsof показывает «что именно» и «кто».
Альтернатива:
# Когда точно знаем, что ищем сетевой порт. Быстрее и чаще установлена по умолчанию.
ss -tlnp | grep 3000
lsof выручает, когда:
1. Нужно посмотреть не только TCP, но и UDP
2. Проблема не с портом, а с файлом или папкой
3. Хотите увидеть все соединения процесса целиком
P.S. Самый частый сценарий: lsof -i :8080 - видим PID - kill -9 PID. Всё, порт свободен.
👉🏻 Я в Telegram - t.me/helcode
👉🏻 Я в VK - vk.com/helcode
👉🏻 Я на Boosty - boosty.to/helcode