Eu tenho um daemon antigo que desejo controlar usando o systemd. Quando seu arquivo de configuração muda, ele precisa ser eliminado e reiniciado. Em outras palavras, após editar o arquivo de configuração, systemctl reload MYSERVICE
deve-se matar o processo e reiniciá-lo.
Tentativa 1: tente os padrões. Isso diz ao systemd como iniciar o daemon, mas não como recarregá-lo.
[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
Como resultado start
e restart
trabalho, mas reload
dá este erro:
# systemctl reload MYSERVICE
Failed to reload MYSERVICE.service: Job type reload is not applicable for unit MYSERVICE.service.
Tentativa 2: diga como encerrar o processo. Isso mata o processo, mas o systemd não o reinicia para mim.
[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
ExecReload=/bin/kill -HUP $MAINPID
...Seguido por...
# systemctl daemon-reload
# systemctl reload MYSERVICE
...mata o processo mas não é reiniciado automaticamente.
Tentativa 3: Use ExecReload para reiniciar o processo também. Isso falha por alguns motivos:
ExecReload=/bin/kill -HUP $MAINPID ; /usr/bin/MYSERVICE
...a mensagem de erro que recebo...:
# 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.
Eu esperaria que houvesse um ReloadType=kill_and_restart ou algo assim, mas não tive essa sorte.
Como dizer ao systemd para matar e reiniciar um daemon ao recarregar?
A resposta é: "você não"! Mas temos boas notícias.
A filosofia do systemd é que o recarregamento é opcional e deve ser deixado indefinido se não houver uma verdadeira funcionalidade de recarregamento. Eu definiria "funcionalidade de recarregamento verdadeiro" como um recarregamento que não mata e reinicia o serviço ou faz com que o serviço altere seu PID. Em outras palavras, o systemd deseja apenas refletir quais recursos existem.
Em vez disso, você deve usar
systemctl reload-or-restart
o que fará um recarregamento, se existir, e uma reinicialização, se não existir.Da página de manual...
Portanto: (1) deixe ExecReload em branco, (2) use
systemctl reload-or-restart MYSERVICE
e, (3) você deve estar pronto.Se você tentar usar ExecReload para definir uma maneira de matar e reiniciar o serviço, ele terá um novo PID e o systemd ficará confuso.
a filosofia do systemd
reload
é opcional e o usuário do systemd deve saber, para cada serviço, se deve chamarreload
ou fingir chamandorestart
.Portanto, a resposta à sua pergunta é: "Não funciona e não deveria. Por favor, resolva isso na próxima camada superior."
Em outras palavras, o systemd deseja que você implemente " reload " apenas se o serviço subjacente oferecer suporte a uma verdadeira funcionalidade de recarregamento... ou seja, um recarregamento que não mata e reinicia o serviço ou faz com que o serviço altere seu PID. Em outras palavras, o systemd deseja apenas refletir quais recursos existem.
Você pode estar se perguntando: Mas não seria mais fácil se eu pudesse implementar um recarregamento "falso" permitindo
ExecReload
matar e reiniciar o serviço? Então eu poderia usarsystemctl reload FOO
todos os meus serviços e não teria que lembrar quais suportam e quais não?Sim, isso seria mais fácil, mas não seria o jeito do systemd. O Systemd deseja que o chamador seja o que sabe se
reload
existe para o serviço. O Systemd quer ser uma interface comum para os recursos existentes, não quer ser responsável por preencher as lacunas.Por exemplo, o fantoche assume que um serviço orientado ao systemd não possui
reload
e o padrão é matar e reiniciar o processo . Se o tipo Service[] adicionou uma maneira de especificar que o recarregamento existe e que deve ser usado na notificação, ele precisará saber quais serviços têm ou não um recarregamento nativo. Chef e todos os outros sistemas também teriam que aprender a mesma coisa porque o systemd quer que seja resolvido nessa camada. (MiniRant: para iniciar um processo, o systemd parece ser o sistema i-do-tudo-na-minha-camada onisciente, que monta tudo e personaliza todos os namespaces. Portanto, não posso dizer por que não estenda essa filosofia para recarregar. Talvez um dos autores possa contribuir aqui.)