У меня есть демон старой школы, которым я хочу управлять с помощью systemd. Когда его конфигурационный файл изменяется, его нужно убить и перезапустить. Другими словами, после редактирования файла конфигурации, systemctl reload MYSERVICE
следует завершить процесс и перезапустить его.
Попытка 1: попробуйте значения по умолчанию. Это сообщает systemd, как запустить демон, а не как его перезагрузить.
[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
В результате start
и restart
работает, но reload
выдает эту ошибку:
# systemctl reload MYSERVICE
Failed to reload MYSERVICE.service: Job type reload is not applicable for unit MYSERVICE.service.
Попытка 2: Расскажите, как убить процесс. Это убивает процесс, но systemd не перезапускает его для меня.
[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
ExecReload=/bin/kill -HUP $MAINPID
...с последующим...
# systemctl daemon-reload
# systemctl reload MYSERVICE
... убивает процесс, но он не перезапускается автоматически.
Попытка 3: используйте ExecReload, чтобы перезапустить процесс тоже. Это терпит неудачу по нескольким причинам:
ExecReload=/bin/kill -HUP $MAINPID ; /usr/bin/MYSERVICE
... сообщение об ошибке я получаю ...:
# systemctl daemon-reload
# systemctl reload MYSERVICE
Job for MYSERVICE.service failed because the control process exited with error code. See "systemctl status MYSERVICE.service" and "journalctl -xe" for details.
Я ожидаю, что там будет ReloadType = kill_and_restart или что-то, но не такая удача.
Как сказать systemd убить и перезапустить демон при перезагрузке?
Ответы:
Ответ: «Ты не»! Но у нас есть хорошие новости.
Философия systemd заключается в том, что перезагрузка является необязательной, и ее следует оставить неопределенной, если нет реальной функции перезагрузки. Я бы определил «истинную функциональность перезагрузки» как перезагрузку, которая не убивает и не перезапускает службу, или заставляет службу изменять свой PID. Другими словами, systemd хочет только отразить, какие функции существуют.
Вместо этого вы должны использовать,
systemctl reload-or-restart
который выполнит перезагрузку, если она существует, и перезагрузку, если она не существует.Со страницы руководства ...
Поэтому: (1) оставьте ExecReload пустым, (2) используйте
systemctl reload-or-restart MYSERVICE
и (3) вы должны быть полностью настроены.Если вы попытаетесь использовать ExecReload для определения способа уничтожения и перезапуска службы, у нее будет новый PID, и systemd будет сбит с толку.
источник
Философия systemd заключается в том, что
reload
она необязательна, и пользователь systemd должен знать для каждой службы, следует ли ей вызыватьreload
или подделывать ее, вызываяrestart
.Поэтому ответ на ваш вопрос: «Это не работает, и это не должно. Пожалуйста, решите это на следующем более высоком уровне».
Другими словами, systemd хочет, чтобы вы реализовали « перезагрузку » только в том случае, если базовый сервис поддерживает истинную функциональность перезагрузки ... т.е. перезагрузку, которая не уничтожает и не перезапускает службу, или не заставляет службу изменять свой PID. Другими словами, systemd хочет только отразить, какие функции существуют.
Вы можете спросить себя: а не проще ли было бы реализовать «фальшивую» перезагрузку, позволив
ExecReload
убить и перезапустить службу? Тогда я мог бы использоватьsystemctl reload FOO
все свои услуги, и мне не пришлось бы вспоминать, какие из них поддерживают, а какие нет?Да, это было бы проще, но это не было бы способом systemd. Systemd хочет, чтобы вызывающий был тем, кто знает,
reload
существует ли для службы. Systemd хочет быть общим интерфейсом с существующими функциями, не хочет отвечать за заполнение пробелов.Например, puppet предполагает, что служба, управляемая systemd, не имеет
reload
и по умолчанию убивает и перезапускает процесс . Если в типе Service [] добавлен способ указать, что перезагрузка существует и что ее следует использовать при уведомлении, необходимо узнать, какие службы имеют или не имеют встроенной перезагрузки. Chef и всем остальным системам также придется учиться тому же, потому что systemd хочет, чтобы это было решено на этом уровне. (MiniRant: для запуска процесса systemd представляется всезнающей, универсальной, настраивающей все пространство имен системой i-do-everything-at-my-layer. Поэтому я не могу сказать вам, почему это не так. расширить эту философию до перезагрузки. Может быть, один из авторов может быть здесь.)источник
systemctl reload-or-restart
, который перезагрузит сервис, если он его поддерживает, и перезапустит, если это не так. Понятия не имею, почему Puppet делает это предположение.