Address already in use: как найти, кто занял порт, и почему он не всегда освобождается сразу
Сервис не запускается, потому что порт занят. Кажется, решение очевидно: найти PID и завершить процесс. Но иногда процесса уже нет, а порт всё ещё остаётся недоступен из-за состояния TIME_WAIT. В случае с Docker его может удерживать контейнер через docker-proxy.
В статье разбираются основные сценарии этой ошибки и способы диагностики в Linux, macOS и Windows: как найти владельца порта через ss, lsof, netstat или PowerShell, правильно остановить systemd-сервис либо контейнер и отличить живой процесс от TCP-соединения, ожидающего завершения.
Отдельная часть посвящена профилактике: SO_REUSEADDR, различиям его поведения в Linux и Windows, а также тому, почему его не следует путать с SO_REUSEPORT.
Читать дальше на Хабре →
Сервис не запускается, потому что порт занят. Кажется, решение очевидно: найти PID и завершить процесс. Но иногда процесса уже нет, а порт всё ещё остаётся недоступен из-за состояния TIME_WAIT. В случае с Docker его может удерживать контейнер через docker-proxy.
В статье разбираются основные сценарии этой ошибки и способы диагностики в Linux, macOS и Windows: как найти владельца порта через ss, lsof, netstat или PowerShell, правильно остановить systemd-сервис либо контейнер и отличить живой процесс от TCP-соединения, ожидающего завершения.
Отдельная часть посвящена профилактике: SO_REUSEADDR, различиям его поведения в Linux и Windows, а также тому, почему его не следует путать с SO_REUSEPORT.
Читать дальше на Хабре →