Docker и сервер

Hot-reload не равен рестарту: утечка не уходит

Панель ответила «restart выполнен», а порт не слушается и память не освободилась. Как отличить reload от настоящего пересоздания процесса.

5 мин чтения

Симптом

Выполнили «restart» сервиса через панель или оркестратор — а эффекта нет: новый порт не слушается, зависшие ресурсы не освободились, изменение конфига не подхватилось. Команда при этом отработала без ошибок.

Причина

Многие «restart» на деле — hot-reload: процессу шлётся сигнал перечитать конфиг, но сам процесс не пересоздаётся, PID остаётся прежним. Последствия:

Решение

Отличайте hot-reload от полного рестарта явно. Факт пересоздания процесса проверяется по времени старта:

ps -o pid,lstart,cmd -C <процесс>

Если PID и lstart прежние — процесс не перезапускался, что бы ни ответила панель.

Когда нужен именно полный перезапуск — новый слушающий порт, сброс утечки, глубокая смена конфигурации — делайте docker restart <контейнер>, а не мягкий reload оркестратора. Для конфигурационных файлов, смонтированных в контейнер, полезен docker compose up -d --force-recreate.

Вывод. «Команда restart выполнилась успешно» ничего не говорит о том, что именно она сделала. Reload (SIGHUP-класс) и рестарт (пересоздание процесса) — разные операции с разными гарантиями. Проверяйте результат по наблюдаемому состоянию: PID и время старта, слушающие порты, освобождённые ресурсы, — а не по коду возврата. Когда цель — сбросить накопленное состояние или поднять новый листенер, гарантию даёт только пересоздание процесса.

Как подключиться за 2 минуты
Частые вопросы

Частые вопросы

Почему после команды restart новый порт не начинает слушаться?
Многие команды restart на деле выполняют hot-reload: процессу шлётся сигнал перечитать конфиг, но сам процесс не пересоздаётся, PID остаётся прежним. Новый инбаунд или порт начинает слушаться только после полного пересоздания контейнера, а не после мягкого reload.
Освобождается ли утёкшая память при hot-reload?
Нет, утёкшие ресурсы — файловые дескрипторы, память, зависшие сессии — при reload не освобождаются, потому что их продолжает держать тот же живой процесс.
Как проверить, что процесс действительно перезапустился, а не получил reload?
Факт пересоздания процесса проверяется командой ps -o pid,lstart,cmd -C процесса — если PID и lstart остались прежними, процесс не перезапускался, что бы ни ответила панель.
Какая команда даёт гарантированный полный перезапуск сервиса?
Когда нужен именно полный перезапуск — новый слушающий порт, сброс утечки, глубокая смена конфигурации — используют docker restart контейнера, а не мягкий reload оркестратора.
Что использовать, если конфигурационные файлы смонтированы в контейнер?
Для конфигурационных файлов, смонтированных в контейнер, полезен docker compose up -d --force-recreate.
Похожее

Ещё в базе знаний

Подключите рабочий VPN

Инструкции базы знаний написаны под ключи VPN PRO: ключ выдаёт Telegram-бот за минуту, работоспособность гарантируем. Промокод VPN10 — 10 дней бесплатно, без карты.

Промокод VPN10 — 10 дней бесплатно · до 31 августа · передавайте друзьям