Как выяснить, чем занят порт в системе?
Что проверяют
Умеете ли вы за минуту дойти от номера порта до конкретного процесса, юнита systemd или контейнера. Следом обычно спрашивают, что делать, если порт занят, а процесса не видно, или почему сервис не стартует с ошибкой address already in use.
Как отвечать
На Linux основной инструмент ss из пакета iproute2. netstat из net-tools давно устарел и на свежих системах часто не установлен.
sudo ss -ltnp 'sport = :8080': слушающие TCP-сокеты на порту с PID и именем процесса, для UDP ключ-u. Безsudoколонка процесса пустая для чужих процессов;sudo lsof -nP -iTCP:8080 -sTCP:LISTEN: то же через открытые файлы;sudo fuser 8080/tcp: просто PID, удобно в скриптах.
По PID дальше: ps -fp 1234 покажет командную строку, systemctl status 1234 назовёт юнит, которому принадлежит процесс, /proc/1234/cwd подскажет каталог запуска.
Отдельно разберите случаи, когда процесс не находится:
- Docker: опубликованный порт держит
docker-proxyили правило DNAT, контейнер ищется черезdocker ps --filter publish=8080; - сетевые namespace:
ssвидит только своё пространство, внутрь заходят черезnsenter -t 1234 -n ss -ltnp; - Kubernetes: NodePort обслуживают правила kube-proxy, смотрите
kubectl get svc -A; - socket activation: порт держит сам systemd, юнит виден в
systemctl list-sockets.
На Windows это netstat -ano | findstr :8080 и затем tasklist /FI "PID eq 1234", в PowerShell Get-NetTCPConnection -LocalPort 8080.
Где спотыкаются
Запускают ss -p без прав и решают, что порт никто не держит, хотя процесс просто принадлежит другому пользователю.
Предлагают nmap. Сканер покажет, что порт открыт, но не скажет, какой процесс его слушает, и на своей машине он здесь лишний.
Путают слушающий сокет с установленным соединением: lsof -i :8080 без фильтра по состоянию выводит и клиентов, подключённых к порту, и владелец теряется в списке.