Eu portei meu daemon controlado por LSB para systemd usando um script wrapper que inicia e para o daemon. Meu arquivo de serviço systemd (multi-instância) usa Type=forking
, ExecStart=...
, ExecStop=...
e PIDFile=...
.
Ao iniciar, tudo parece OK no systemd, mas parar sempre parece falhar. Como no ambiente LSB isso funcionou bem, suspeitei que o systemd (228) fizesse algo ruim.
Na verdade, descobri que, após uma inicialização bem-sucedida , o arquivo PID desapareceu , então meu script wrapper retorna com o código de saída 1 (já que o arquivo PID não foi encontrado onde esperado).
Então, o systemd realmente remove o arquivo PID? O efeito colateral é que o systemd parece matar meu daemon com força depois que o script wrapper retornou um erro.
Sim, o systemd remove pidfiles quando a unidade de serviço entra no estado 'morto'. No entanto, isso acontece depois que o serviço foi interrompido (ExecStop finalizado e processos encerrados).
Eu recomendaria não usar scripts wrapper para ExecStop, porque... bem, é isso que o systemd faz. Sendo um gerenciador de serviços, ele sabe qual é o PID do seu daemon (mesmo que você não use um pidfile) e pode enviar sinais nativamente para interromper o serviço.
Parece
systemd
que não remove o arquivo PID; em vez disso, meu daemon não o cria devido a uma incompatibilidade com o "bom e velho init": Depois de bifurcar () o processo filho do meu daemon espera que o pai saia assim:Em seguida, a criança escreveria o arquivo PID.
Como
strace
mostrado,getppid()
retornava constantemente31940
o que acabou sendo o PID do systemd (o systemd também tem outro PID de1
). O mesmosystemd
acontece com alguns reparenting incompatíveis mágicos.Talvez o problema esteja realmente relacionado ao fato de que meu serviço está sendo executado como um serviço de "usuário" (e não como um serviço de "sistema") (ainda não tenho certeza sobre as diferenças). Esta questão pode estar relacionada: Como posso executar o systemd como um processo com pid 1 e com pid não 1?
Também é útil: Qual é a diferença entre o usuário do systemd e os serviços do sistema?
Na verdade, o problema desapareceu depois que mudei o serviço de um serviço de usuário para um serviço de sistema.