Порт занят (port already in use) — почему и как быстро починить

Запускаешь проект — а вместо сайта красное: Error: listen EADDRINUSE: address already in use :::3000 или просто «port already in use». Перевод: дверь 3000 уже кем-то занята, второй жилец туда не влезет. И почти всегда виноват не баг в коде, а забытый процесс. Разберём три причины — от самой частой к редкой.
Если само слово «порт» звучит туманно — сначала загляни в что такое порт, дальше будет понятнее.
Причина 1. Старый процесс не закрылся (99% случаев)
Ты уже запускал проект, закрыл вкладку терминала или нажал не то — а сервер остался жить в фоне и держит порт. Новый запуск стучится в ту же дверь и получает «занято».
Как проверить: спроси у системы, кто сидит на порту.
- macOS/Linux:
lsof -i :3000— покажет процесс и его номер (PID). - Windows:
netstat -ano | findstr :3000— PID в последней колонке.
Как починить: выгони этот процесс по его PID.
- macOS/Linux:
kill -9 12345(подставь свой PID вместо 12345). - Windows:
taskkill /PID 12345 /F.
Порт свободен — запускай заново. Это лечит подавляющее большинство случаев.
Причина 2. Порт реально занят другим приложением
Иногда на «твоём» порту сидит совсем другая программа — другой проект, Docker-контейнер, какой-нибудь фоновый сервис. Особенно легко попасть на ходовых номерах вроде 8080.
Как проверить: тот же lsof -i :3000 или netstat, но в имени процесса ты увидишь не свой проект, а что-то чужое.
Как починить — два пути:
- Закрой ту программу, если она сейчас не нужна.
- Или смени порт своему проекту — часто это одна строчка в настройках или переменная окружения (
PORT=3001). Запустишь на соседней двери — конфликта нет. Это самый безболезненный вариант, если непонятно, что за сосед.
Причина 3. Двойной запуск или зависший терминал
Бывает проще некуда: ты запустил проект дважды — во второй вкладке терминала или второй раз нажав «Run» в редакторе. Первый экземпляр занял порт, второй ругается.
Как проверить: глянь на открытые вкладки терминала и процессы редактора — нет ли уже работающего сервера.
Как починить: закрой лишний запуск — в его вкладке нажми Ctrl+C. Если вкладка потерялась, вернись к способу из причины 1 и убей процесс по PID.
Как узнать, какой процесс держит порт?
Командой, которая спрашивает у системы «кто на этом порту». macOS/Linux: lsof -i :3000. Windows: netstat -ano | findstr :3000. В ответе — имя процесса и его PID (числовой идентификатор). PID нужен, чтобы прицельно закрыть именно этот процесс, не задев остальные.
Безопасно ли просто сменить порт?
Да, абсолютно. Порт — это всего лишь номер двери, приложению без разницы, на какой висеть. Смена 3000 на 3001 ничего не ломает — поменяется только адрес, по которому открываешь: localhost:3001. Это законный и часто самый быстрый выход, когда возиться с чужим процессом не хочется. Если после этого сайт всё равно не открывается — причина другая, загляни в почему localhost не отвечает.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





