После перезапуска сервис не может занять свой порт
Сервис перезапускается при выкатке. Иногда bind завершается ошибкой «Address already in use», хотя старый процесс уже завершён и в списке процессов его нет. Через одну-две минуты запуск проходит без изменений в коде. Просмотр состояния сокетов показывает на этом порту множество записей в состоянии TIME_WAIT.
Что происходит и как это правильно решать?
- Старый процесс на самом деле жив и продолжает держать порт: при рестарте его нужно принудительно убивать сигналом
- Закрытые соединения ещё в состоянии TIME_WAIT, адрес считается занятым; нужен параметр повторного использования адреса до bind
- Порт занял другой сервис, поэтому нужно выбрать свободный порт из непривилегированного диапазона и закрепить его
- Соединения нужно закрывать вызовом shutdown вместо close: тогда состояние TIME_WAIT не возникает и порт освобождается сразу
