Когда операция по «снятию воздействия» сетевого процесса, порта или соединения завершается неудачно, возникают риски утечки ресурсов, конфликтов портов и отказа сервисов․ Ниже — подробное руководство, почему это происходит и куда обращаться за помощью․
Что считается «неудачной»
- Порт остаётся занят (ошибки вроде
EADDRINUSE)․ - Сокет не закрывается (
socket․closeвозвращает ошибку)․ - Приложение продолжает слушать события после вызова
socket․offилиserver․close․ - Система не освобождает TCP/UDP сокеты после завершения процесса․
Типичные причины сбоев
Ошибки в коде
- Неправильное использование
socket․off— если в․off(event, handler)передан не тот же экземпляр функции-обработчика, отписка не сработает․ - Несоблюдение асинхронности —
server․closeвыполняется колбэк асинхронно, а дальнейший код продолжает работать, создавая иллюзию «зависания»․ - Утечка ресурсов — в цикле создаются слушатели, но не удаляются․
Системные ограничения
- Процесс-зомби удерживает сокет (особенно на Windows)․
- SELinux / firewall блокирует закрытие порта․
- TIME_WAIT — порт ещё не освободился на уровне ОС даже после корректного закрытия․
Как диагностировать
| ОС | Команда для проверки | Пример |
|---|---|---|
| Linux/macOS | lsof -i :<порт> | lsof -i :8080 |
| Windows | netstat -ano | findstr :<порт> | netstat -ano | findstr :8080 |
| PowerShell | Get-NetTCPConnection -LocalPort <порт> | Get-NetTCPConnection -LocalPort 8080 |
Как правильно «снять воздействие»
- Остановить процесс:
- Linux/macOS:
kill -15 $(lsof -t -i:8080)(SIGTERM), затемkill -9при необходимости․ - Windows:
taskkill /PID <pid> /F․
- Linux/macOS:
- В коде Node․js:
const server = app․listen(8080, => …); // корректное завершение server․close((err) => { if (err) console․error(err); else console․log('Порт освобождён'); }); - Удалить все обработчики событий:
socket․removeAllListeners('data'); // или socket․off('data', specificHandler); - Установить
SO_REUSEADDR, если нужно быстро перезапустить сервер на том же порту․
Контакты для обращений
- Команда DevOps вашей компании
- E-mail: devops@example․com
- Slack-канал:
#incidents-sockets - Телефон: +7 (495) -23-45-67 (круглосуточно)
- Служба поддержки ОС / облачного провайдера
- AWS Support Center → support․aws․amazon․com
- Microsoft Azure: ###-###-#### (бесплатно по РФ)
- Linux Foundation Helpdesk: support․linuxfoundation․org
- Форумы и чаты
- Stack Overflow: тег sockets
- Russian Unix forum: linux․org․ru
- Telegram-чат «DevOps & SRE» —
@ru_devops_chat
- Экстренные сервисы (если инцидент серьёзно влияет на продакшен)
- 24×7 Hotline: +7 (800) -55-01-23
- PagerDuty on-call: pagerduty․example․com
Всегда проверяйте PID процесса перед «убийством»․
Используйте graceful shutdown вместо SIGKILL․
Логируйте ошибки закрытия сокетов и портов в централизованный лог․
При частых конфликтах — рассмотрите динамические диапазоны портов (например, 49152–65535)․
Держите под рукой контакты выше: быстрая связь — залог минимального downtime․