Você pode tentar remover o PIDFile, o que não é necessário. Ou execute seu binário com exec no script.
Se você iniciar seu serviço, qual é o PID pai do binário aaa? É PID 1 ou seu script de shell, que não saiu?
Eu criei um arquivo de serviço personalizado com a seguinte aparência:
[Unit]
Description=aaa main application
After=syslog.target network-online.target
[Service]
Type=forking
PIDFile=/usr/local/aaa_path/aaa/aaa.pid
WorkingDirectory=/usr/local/aaa_path/aaa/
ExecStart=/usr/local/aaa_path/aaa/run_aaa.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Ao verificar o status com:
systemctl status aaa
Tudo parece bem, exceto:
... systemd[1]: aaa.service: Supervising process 18285 which is not our child. We'll most likely not notice when it exits.
Imaginando por que esta mensagem está sendo exibida e se é algo para se preocupar?
meu ExecStart é um script bash chamado run_aaa.sh; O que ele faz é preparar algumas variáveis de ambiente, executar alguns scripts de manutenção e finalmente executar o binário aaa (como um daemon) com algumas opções de linha de comando dinâmicas, em segundo plano - e encerra (o script run_aaa.sh é encerrado, o daemon aaa binário continua rodando em segundo plano, e mantém seu próprio arquivo pid que o systemd conhece)
Eu sei que o systemd está executando o run_aaa.sh e espera que ele bifurque (porque eu especifiquei type = forking) e ele realmente "bifurcou" executando o daemon binário "aaa" em segundo plano e saindo depois. Além disso, eu especifico o caminho PIDFile e meu binário aaa mantém este PIDFile como deveria, então por que o systemd reclamaria que ele poderia falhar ao supervisionar meu daemon?
Existe uma maneira melhor de configurar o serviço para este caso de uso? (Eu devo usar o script run_aaa.sh para executar meu binário)
Você pode tentar remover o PIDFile, o que não é necessário. Ou execute seu binário com exec no script.
Se você iniciar seu serviço, qual é o PID pai do binário aaa? É PID 1 ou seu script de shell, que não saiu?
Se você precisar executar o shell script apenas uma vez, basta adicionar ExecStartPre=/path/to/script
e executar seu daemon com ExecStart=/path/to/daemon
. O script não será executado na reinicialização, talvez isso não seja o que você precisa.
Se você precisar executar o script também nas reinicializações, defina Type=simple
e execute o daemon no modo de primeiro plano a partir do shell script, para que o script não seja encerrado. Mas você ainda recebe essa mensagem e as ações de parada / reinicialização estão aguardando 30 segundos antes de State 'stop-sigterm' timed out. Killing
, muito desagradável. Se você adicionar ExecStop=/bin/kill $MAINPID
, o problema de tempo limite desaparece. Não remova PIDFile
. Você ainda verá essa mensagem, mas cada ação iniciar / parar / reiniciar / status funcionará corretamente. Talvez haja outra maneira melhor de conseguir o mesmo. Pelo menos isso funciona para mim e a mensagem pode ser ignorada com segurança. Quando o daemon é encerrado, o shell script também é encerrado, então o systemd saberá disso.