Networking Lifehack

Кто занял порт: одна команда для Linux и Windows

Сервис не стартует из-за занятого порта. Как за одну команду узнать, какой процесс его держит — в Linux, Windows и macOS.

Проверено: Ubuntu 24.04, Windows 11
Кто занял порт: одна команда для Linux и Windows

Ошибка address already in use означает, что порт занят. Вопрос только один: кем.

Linux

sudo ss -tlnp | grep :8080

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

  • -t — TCP, для UDP используйте -u
  • -l — только слушающие сокеты
  • -n — числовые порты, без резолвинга имён
  • -p — показать процесс, требует root

Вывод:

LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("node",pid=4821,fd=23))

Здесь процесс node с PID 4821.

Альтернатива через lsof:

sudo lsof -i :8080

Совет. Утилита netstat в современных дистрибутивах не установлена — её заменил ss из пакета iproute2. Синтаксис ключей почти совпадает.

Windows

Командная строка:

netstat -ano | findstr :8080

Последняя колонка — PID. Узнать имя процесса:

tasklist /FI "PID eq 4821"

PowerShell делает это одной командой:

Get-Process -Id (Get-NetTCPConnection -LocalPort 8080 -State Listen).OwningProcess

macOS

sudo lsof -nP -iTCP:8080 -sTCP:LISTEN

Что делать дальше

Определились с процессом — решайте, что важнее. Либо освободить порт:

sudo systemctl stop имя-сервиса

Либо перенастроить своё приложение на другой порт. Второе обычно правильнее: если порт занят системным сервисом, у него были причины там оказаться.

Предупреждение. Если порт держит процесс с PID 4 в Windows — это ядро, чаще всего драйвер HTTP.sys. Убивать его нельзя. Посмотрите зарезервированные URL: netsh http show urlacl.

Итог

Linux: sudo ss -tlnp | grep :ПОРТ. Windows: netstat -ano | findstr :ПОРТ плюс tasklist. Двоеточие перед номером обязательно — без него в выдачу попадут порты вроде 80800.