Eu tenho um serviço systemd (para heka) que me causa algumas dores de cabeça.
O problema é que "start" retorna com sucesso mesmo se o daemon heka morrer logo após o início. Isso está acontecendo se os arquivos de configuração estiverem errados, por exemplo: o processo irá iniciar, irá verificar a configuração e morrerá se não estiver satisfeito com o que encontrar. Systemd retorna com sucesso neste caso.
Existe alguma maneira de forçar o systemd a verificar o status do programa após a inicialização? Talvez dormir n segundos após o início do processo?
Este é o roteiro:
[Unit]
Description=Heka event/metric/log collection and routing daemon
After=network.target auditd.service
ConditionPathExists=!/etc/heka/hekad_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/heka
Type=simple
PIDFile=/var/run/hekad.pid
ExecStart=/usr/bin/hekad -config=/etc/heka
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
StandardError=inherit
[Install]
WantedBy=multi-user.target
Alias=heka.service
Responder1
Você pode encadear vários comandos ExecPostStart. E você pode executá-los mesmo se o ExecStart principal falhar, adicionando um-/(systemd.service: Tipo =). Algo assim:
ExecStart=-/usr/bin/hekad -config=/etc/heka
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/kill -0 $MAINPID &>/dev/null
Isso garante que você ainda tenha o MAINPID
que usar ao parar ou reiniciar o serviço, por exemplo.
Responder2
Se houver uma maneira fácil de verificar se hekad
ainda está ativo, eu iniciaria o daemon usando ExecStartPre=/usr/bin/hekad -config=/etc/heka
e ExecStart
executaria um pequeno script que possui um loop que primeiro dorme X segundos e depois verifica se o daemon hekad ainda está em execução. Quebrar o loop somente se hekad
parece ter parado.
Responder3
Você deve usar ExecStartPost
para iniciar um comando ou script que fica suspenso e depois executa uma verificação. Se sair diferente de zero, a unidade é considerada uma falha.
Ver:https://www.freedesktop.org/software/systemd/man/systemd.service.html