I wrote a simple script for systemd to call …
… qual foi a fonte do problema. Seu "script simples" cancelou onde a saída padrão e o erro padrão foram enviados. E isso totalmente desnecessariamente. Todo o redirecionamento, gravação de arquivo PID, nohup
-ing e forking é totalmente desnecessário para algo que já é daemonizado e já tem seu PID conhecido pelo gerenciador de serviços. Você não precisa de nenhuma parte desse script. Em vez disso, escreva sua unidade de serviço assim:
[Unit] Description=Start my_program client after system is booted [Service] Type=simple ExecStart=/home/frederick/Applications/my_program-go/my_program-local -c /home/frederick/Applications/my_program-go/config.json WorkingDirectory=/home/frederick/Applications/my_program-go/ StandardOutput=journal+console [Install] WantedBy=multi-user.target
Invoque todas as opções necessárias para impedir que o seu programa bifurque, a menos que ele realmente implemente o protocolo de prontidão de bifurcação. Muito poucos programas realmente fazem. Seu "script simples" certamente não o fez, pois saiu do processo pai muito antes de o daemon inicializar e estar pronto.
Leitura adicional
- Jonathan de Boyne Pollard (2015). A casa do sistema do horror . Respostas frequentemente dadas.
- Systemd mata o serviço imediatamente após o início
- Problema de script do serviço Yocto linux
- A página
systemd.exec
man (e tambémsystemd.service
esystemd.unit
). A página man diz: Arquivos de configuração de unidades para serviços, soquetes, pontos de montagem e dispositivos de troca compartilham um subconjunto de opções de configuração que definem o ambiente de execução de processos gerados. Esta página man lista as opções de configuração compartilhadas por esses quatro tipos de unidades.