Linux: какой процесс слушает порт и как его остановить
Чтобы узнать, какой процесс занял порт 8080, выполните sudo ss -ltnp 'sport = :8080' или sudo lsof -i :8080. В выводе будут имя программы и номер процесса (PID). Остановить его можно командой kill PID. Права root нужны, чтобы увидеть чужие процессы.
Найти процесс по порту
ss -ltnp 'sport = :8080' # слушающие TCP-порты с процессами
ss -ltnp | grep ':8080' # то же через фильтр
lsof -i :8080 # любые сокеты на порту
lsof -t -i :8080 # только номера процессовРасшифровка ключей ss:
Ключ | Значение |
|---|---|
| Только слушающие сокеты |
| TCP |
| UDP |
| Не переводить порты и адреса в имена |
| Показать процесс-владельца |
В выводе ищите столбец Process, например users:(("python3",pid=1234,fd=3)).
Все слушающие порты
ss -tulpn # TCP и UDP, с процессами
netstat -tulpn # устаревший аналог из пакета net-toolsАдрес 127.0.0.1:8080 означает, что порт доступен только с этого компьютера. Адреса 0.0.0.0:8080 и [::]:8080 означают, что порт открыт для всех интерфейсов.
Остановить процесс
kill $(lsof -t -i :8080) # вежливо попросить завершиться (SIGTERM)
kill -9 $(lsof -t -i :8080) # принудительно, если не помогло
fuser -k 8080/tcp # найти и завершить одной командойНачинайте с обычного kill: программа успеет сохранить данные и закрыть соединения. kill -9 применяйте, только когда процесс не отвечает.
Проверить, свободен ли порт
ss -ltn 'sport = :8080' | grep -q LISTEN && echo "занят" || echo "свободен"Если порт занят системной службой
Для служб вроде nginx лучше остановить сервис, а не процесс:
systemctl status nginx
sudo systemctl stop nginxИначе systemd может сразу запустить процесс заново.
Частые вопросы
Что означает ошибка «address already in use»?
Порт уже слушает другая программа или предыдущий экземпляр вашей. Найдите владельца командами выше. После падения программы порт иногда остаётся занят короткое время в состоянии TIME_WAIT.
Почему ss не показывает процесс?
Для чужих процессов нужны права root: выполните команду с sudo.
Как открыть порт для проверки изнутри контейнера Docker?
В контейнере может не быть ss. Используйте docker exec имя sh -c "cat /proc/net/tcp" либо смотрите порты снаружи: docker port имя.