Eu tenho um serviço systemd para executar um script bash de monitoramento que é iniciado por um timer systemd. Eu usei Type=oneshot
o que parece mais apropriado. Porém, às vezes o script precisa chamar outro programa, o que acontece com o fork. Depois de fazer isso, o script será concluído e encerrado, mas assim que o script for encerrado, o systemd eliminará todos os processos filhos restantes.
Eu poderia usar KillMode=process
para evitar isso, mas há o risco de que em outros caminhos do script outros processos (que não bifurcam) possam permanecer em execução após a saída.
Qual é a melhor maneira de lidar com isso?
A propósito, o programa de bifurcação é dhcpcd, mas acho que a pergunta se aplica de maneira geral. O dhcpcd foi originalmente iniciado por ifplugd e este script é à prova de falhas caso o sistema acabe em um estado em que o dhcpcd não esteja mais sendo executado.
Responder1
Os processos são eliminados porque pertencem a um grupo de controle (cgroup) associado ao serviço, por exemplo, aqui (para serviço do sistema):
/sys/fs/cgroup/systemd/system.slice/your-service.service
Para mover um processo para fora do cgroup,atribua-o a outro cgroup. O "cgroup pai" parece certo. Para um serviço do sistema é assim:
echo <PID> > /sys/fs/cgroup/systemd/system.slice/tasks
# or even to the general systemd cgroup
echo <PID> > /sys/fs/cgroup/systemd/tasks
Para executar algum comando neste cgroup desde o início, execute um shell que se atribua ao cgroup e então exec
s ao comando real:
sh -c 'echo "$$" > /sys/fs/cgroup/systemd/tasks; exec /the/forking/program'
/the/forking/program
substituirá o shell, já no novo cgroup. Quando for bifurcada, a instância bifurcada se encontrará no novo cgroup. Quando o script principal for encerrado, o systemd encerrará os processos no cgroup associado ao serviço, mas o programa em questão não estará entre eles.
Talvez exista uma maneira mais adequada de resolver o seu problema, com arquivos unitários ou algo assim. Eu não sei disso.