arquivo de serviço systemd para script que *às vezes* bifurca

arquivo de serviço systemd para script que *às vezes* bifurca

Eu tenho um serviço systemd para executar um script bash de monitoramento que é iniciado por um timer systemd. Eu usei Type=oneshoto 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=processpara 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 execs ao comando real:

sh -c 'echo "$$" > /sys/fs/cgroup/systemd/tasks; exec /the/forking/program'

/the/forking/programsubstituirá 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.

informação relacionada