Normalmente não poste aqui, mas estou arrancando meu cabelo com este. Eu tenho um script Python que bifurca quando é iniciado e é responsável por iniciar vários outros processos. Esse script costumava ser iniciado na inicialização via sysvinit, mas recentemente eu atualizei para o Debian Jessie, então o adaptei para iniciar via systemd.
Infelizmente, estou com um problema que não consigo resolver. Quando você inicia o script diretamente no shell do usuário, ele inicia os processos filhos corretamente e, quando o script sai, os processos filhos ficam órfãos e continuam em execução.
Quando lançados pelo systemd, se o processo pai sair, todos os filhos também sairão (bem, as telas que eles lançam morrem e aparecem como mortas ???)
Idealmente, preciso poder reiniciar o script pai sem matar todos os processos filhos. Existe algo que estou faltando?
Obrigado!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Edit: Provavelmente é relevante para mim salientar que o script Python é essencialmente um 'controlador' para seus processos filhos. Ele inicia e para servidores em telas gnu, conforme solicitado de um servidor central. Normalmente está sempre em execução, não gera serviços e sai. No entanto, há casos em que eu gostaria de poder recarregar o script sem matar processos filhos, mesmo que isso signifique que os processos fiquem órfãos até o pid 1. Na verdade, não importaria se o script Python iniciasse os processos como um processo pai, se isso for possível.
Uma explicação melhor de como funciona:
- Systemd gera /Server.py
- Server.py bifurca e grava o arquivo pid para Systemd
- O Server.py gera processos do servidor na tela gnu com base em suas instruções
- Server.py continua em execução para executar qualquer reinicialização solicitada do servidor
Ao iniciar sem o Systemd, o Server.py pode ser reiniciado e as telas gnu iniciadas não são afetadas. Ao iniciar com o Systemd, quando o Server.py é encerrado, em vez de os processos de tela ficarem órfãos para o pid 1, eles são mortos.
ExecStop=
não é necessário. A ação padrão do systemd ao parar é matar processos. Você pode dar uma olhada na documentação da KillMode=
diretiva.
simple
ou forking
, na verdade), o último recurso seria Type=oneshot
, RemainAfterExit=yes
e KillMode=control-group
.
Server.py
código e uma descrição de como os serviços lançados bifurcam (se bifurcam). No entanto, de um modo geral, esse é um problema de incompatibilidade do protocolo de prontidão .