Приложение не перечитывает настройки по сигналу
Перезагрузка настроек работает только если приложение это умеет. Для большинства прикладных служб её нет, и правки применяются только перезапуском — важно не путать одно с другим при выкладке.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Приложение не обрабатывает сигнал перезагрузки
Шаблонная команда перезагрузки посылает сигнал, который приложение либо игнорирует, либо понимает как команду выйти.
-
Настройки читаются один раз при старте
Даже при поддержке сигнала приложение может перечитывать не всё: часть параметров применяется только при запуске.
-
Перезапуск рвёт соединения, а перезагрузка не работает
Тогда нужен другой подход: запуск нового экземпляра рядом и переключение, либо обратный прокси, который держит клиентов.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Умеет ли служба перезагружать настройки.
systemctl show myapp.service -p CanReload -p ExecReloadЧто происходило при попытках перезагрузки.
journalctl -u myapp.service -n 30 --no-pager | grep -i reloadРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Шаблонная команда перезагрузки посылает сигнал, который приложение либо игнорирует, либо понимает как команду выйти.
- Как проверить
-
Посмотрите, что делает команда перезагрузки.
systemctl cat myapp.service | grep -i ExecReload systemctl show myapp.service -p CanReload
- Как исправить
- Уберите команду перезагрузки, если приложение её не поддерживает: пусть выкладка использует перезапуск. Ложная возможность опаснее её отсутствия.
- Почему происходит
- Даже при поддержке сигнала приложение может перечитывать не всё: часть параметров применяется только при запуске.
- Как проверить
-
Посмотрите, что изменилось после перезагрузки.
journalctl -u myapp.service -n 20 --no-pager | grep -iE "reload|config"
- Как исправить
- Для таких параметров используйте перезапуск. Это стоит отразить в описании выкладки, чтобы не удивляться.
- Почему происходит
- Тогда нужен другой подход: запуск нового экземпляра рядом и переключение, либо обратный прокси, который держит клиентов.
- Как проверить
-
Посмотрите, есть ли сокет-активация или прокси впереди.
systemctl show myapp.service -p Sockets sudo nginx -T 2>/dev/null | grep -c proxy_pass
- Как исправить
- Сокет-активация позволяет перезапускать службу, не теряя входящие соединения: их держит systemd.
Пример вывода
Перезагрузка настроек прошла, изменения не применились. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl reload myapp.service
$ journalctl -u myapp.service -n 3 --no-pager
systemd[1]: Reloading myapp.service...
systemd[1]: Reloaded myapp.service.
# в журнале приложения — ни строки о перечитывании настроек
Связанные ошибки
- signal=HUP (status=1/HUP) в systemd Процесс службы завершён сигналом HUP. Обычно это перезагрузка настроек, которую программа поняла как команду выйти.
- status=3/NOTIMPLEMENTED в systemd Код 3/NOTIMPLEMENTED по соглашению LSB: запрошенное действие не поддерживается. Обычно это reload у службы, которая его не умеет.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked executable Предупреждение о правах: unit-файл помечен исполняемым. Откуда берётся и почему это стоит исправить.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
Источники
-
systemd.service(5)
ExecReload= и возможность перезагрузки настроек. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на приложении без обработки сигнала: перезагрузка не даёт эффекта.