Linux: какой процесс слушает порт и как его остановить

Категория: Bash · Язык: Bash · Обновлено:

Чтобы узнать, какой процесс занял порт 8080, выполните sudo ss -ltnp 'sport = :8080' или sudo lsof -i :8080. В выводе будут имя программы и номер процесса (PID). Остановить его можно командой kill PID. Права root нужны, чтобы увидеть чужие процессы.

Найти процесс по порту

Bash
ss -ltnp 'sport = :8080'          # слушающие TCP-порты с процессами
ss -ltnp | grep ':8080'           # то же через фильтр
lsof -i :8080                     # любые сокеты на порту
lsof -t -i :8080                  # только номера процессов

Расшифровка ключей ss:

Ключ

Значение

-l

Только слушающие сокеты

-t

TCP

-u

UDP

-n

Не переводить порты и адреса в имена

-p

Показать процесс-владельца

В выводе ищите столбец Process, например users:(("python3",pid=1234,fd=3)).

Все слушающие порты

Bash
ss -tulpn                         # TCP и UDP, с процессами
netstat -tulpn                    # устаревший аналог из пакета net-tools

Адрес 127.0.0.1:8080 означает, что порт доступен только с этого компьютера. Адреса 0.0.0.0:8080 и [::]:8080 означают, что порт открыт для всех интерфейсов.

Остановить процесс

Bash
kill $(lsof -t -i :8080)          # вежливо попросить завершиться (SIGTERM)
kill -9 $(lsof -t -i :8080)       # принудительно, если не помогло
fuser -k 8080/tcp                 # найти и завершить одной командой

Начинайте с обычного kill: программа успеет сохранить данные и закрыть соединения. kill -9 применяйте, только когда процесс не отвечает.

Проверить, свободен ли порт

Bash
ss -ltn 'sport = :8080' | grep -q LISTEN && echo "занят" || echo "свободен"

Если порт занят системной службой

Для служб вроде nginx лучше остановить сервис, а не процесс:

Bash
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 имя.