Docker и сервер

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

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

5 мин чтения Обновлено · Dele Deleev

Симптом

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

Причина

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

  • новый инбаунд или порт начинает слушаться только после полного пересоздания контейнера, а не после мягкого reload;
  • утёкшие ресурсы — файловые дескрипторы, память, зависшие сессии — при reload не освобождаются: их держит тот же живой процесс;
  • часть изменений конфигурации reload просто игнорирует.

Решение

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

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

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

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

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

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

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

Почему после команды 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-бот за минуту, работоспособность гарантируем. 3 дня бесплатно, без карты.

Гарантия работоспособности · оплата СБП, картой МИР или криптовалютой