Ошибка 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.