Systemd: processo de supervisão XXXX que não é nosso filho. Nós provavelmente não perceberemos quando sair

4

Eu criei um arquivo de serviço personalizado com a seguinte aparência:

cat /etc/systemd/system/aaa.service

[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)

    
por ktopaz 23.08.2017 / 10:11

2 respostas

0

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?

    
por 27.10.2017 / 11:19
0

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.

    
por 06.12.2017 / 17:42