Eu tenho um daemon da velha escola que quero controlar usando o systemd. Quando o arquivo de configuração é alterado, ele precisa ser eliminado e reiniciado. Em outras palavras, depois de editar o arquivo de configuração, systemctl reload MYSERVICE
deve interromper 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 matar 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 ele 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 recebida ...:
# 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 sem essa sorte.
Como dizer ao systemd para matar e reiniciar um daemon ao recarregar?
Respostas:
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 funcionalidade de recarregamento verdadeira. Eu definiria "funcionalidade de recarga verdadeira" como uma recarga que não mata e reinicia o serviço ou faz com que o serviço altere seu PID. Em outras palavras, o systemd quer apenas refletir quais recursos existem.
Em vez disso, você deve usar o
systemctl reload-or-restart
que fará uma recarga, se existir, e uma reinicialização, se não existir.Na página do manual ...
Portanto: (1) deixe ExecReload em branco, (2) use
systemctl reload-or-restart MYSERVICE
e, (3) você deve estar pronto.Se você tentar usar o ExecReload para definir uma maneira de matar e reiniciar o serviço, ele terá um novo PID e o systemd ficaria confuso.
fonte
A filosofia do systemd é que
reload
é opcional e o usuário do systemd deve saber, para cada serviço, se deve ligarreload
ou fingir ligandorestart
.Portanto, a resposta para 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 " recarregar " apenas se o serviço subjacente suportar uma verdadeira funcionalidade de recarregamento ... ou seja, um recarregamento que não elimine e reinicie o serviço ou faça com que o serviço altere seu PID. Em outras palavras, o systemd quer apenas refletir quais recursos existem.
Você pode estar se perguntando: Mas não seria mais fácil se eu pudesse implementar uma recarga "falsa" permitindo
ExecReload
matar e reiniciar o serviço? Então eu poderia usarsystemctl reload FOO
para todos os meus serviços e não precisaria lembrar quais os suportam e quais não?Sim, isso seria mais fácil, mas não seria o caminho do systemd. Systemd quer 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 pressupõe que um serviço orientado a systemd não possui
reload
e o padrão é matar e reiniciar o processo . Se o tipo Serviço [] adicionou uma maneira de especificar que a recarga existe e que deve ser usada na notificação, será necessário saber quais serviços têm ou não uma recarga nativa. O Chef e todos os outros sistemas também precisariam aprender a mesma coisa, porque o systemd deseja que ele seja resolvido nessa camada. (MiniRant: para iniciar um processo, o sistema parece ser o sistema eu-tudo-na-minha-camada-que-tudo-sabe-tudo-que-personaliza, tudo-sobre-namespace, portanto, não posso dizer por que não estender essa filosofia para recarregar. Talvez um dos autores possa falar aqui.)fonte
systemctl reload-or-restart
, o que recarregará o serviço se ele for compatível e o reiniciará se não for. Não faço ideia por que Puppet faz essa suposição.