O SystemD gerou N processos?

10

Na minha organização, temos vários processos de trabalho que consomem filas. No momento, estamos usando o SupervisorD para gerenciá-los, mas gostaríamos de usar o SystemD, se possível, para certas vantagens nele. Eu tenho bastante experiência em escrever unidades personalizadas, mas eu não tenho imediatamente um analógico no SystemD para isso.

Na documentação do SupervisorD , um parâmetro chamado numprocs é detalhado, o que permite definir o número de processos que eles gostariam de iniciar com o serviço. Se eu quero 30 processos iniciados, é uma mudança de uma linha.

Existe uma configuração nas unidades do SystemD que me permitirá especificar quantos desses processos eu gostaria de iniciar?

    
por Naftuli Kay 07.06.2016 / 20:13

2 respostas

22

O que Munir mencionou é exatamente como você faz isso. Basicamente, você cria um arquivo service e o inicia 30 vezes. Agora isso pode parecer um pouco desleixado, mas tem vantagens, como ser capaz de calar um deles se estiver se comportando mal, e não ter que calar todos eles. Há também algumas coisas que você pode fazer para facilitar o gerenciamento.

Primeiro, o arquivo da unidade. Crie um arquivo, como /etc/systemd/system/[email protected] . O bit importante é o símbolo @ .

O conteúdo pode parecer:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

Em seguida, inicie-o com systemctl start [email protected] , systemctl start [email protected] .
Os processos que são iniciados serão semelhantes a:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Observe que o %I foi substituído pelo que você colocou após o @ quando você o iniciou.

Você pode começar todos os 30 com um pouco de shell-fu:

systemctl start test@{1..30}.service

Você também pode ativá-los na inicialização, como qualquer serviço normal: systemctl enable [email protected] .

Agora, o que eu quis dizer com as coisas que você pode fazer para tornar o gerenciamento mais fácil: talvez você não queira usar test@{1..30}.service para gerenciar todas elas. É um pouco desajeitado. Você pode criar um novo alvo para seu serviço.

Crie /etc/systemd/system/test.target com:

[Install]
WantedBy=multi-user.target

Em seguida, ajuste o /etc/systemd/system/[email protected] para que pareça:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

Recarregue o systemd com systemctl daemon-reload (necessário apenas se você estiver modificando o arquivo da unidade e não tiver pulado a versão anterior dele). E agora habilite todos os serviços que você quer que sejam gerenciados fazendo systemctl enable test@{1..30}.service .
(Se você já habilitou o serviço enquanto tinha WantedBy=multi-user.target , desative primeiro para limpar a dependência)

Agora você pode fazer systemctl start test.target e systemctl stop test.target e iniciar / interromper todos os 30 processos.
E mais uma vez, você pode habilitar na inicialização como qualquer outro arquivo de unidade: systemctl enable test.target .

    
por 08.06.2016 / 07:12
0

Aqui está o meu exemplo usando um script python que é executado em um virtualenv:

/etc/systemd/system/[email protected]

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

Desativar: sudo systemctl enable my-worker\@{1..30}.service

Ativar N trabalhadores: sudo systemctl enable my-worker\@{1..2}.service

Recarregue: sudo systemctl daemon-reload

Iniciar: sudo systemctl start [email protected]

Verifique o status: sudo systemctl status my-worker@1

Espero que ajude.

    
por 13.10.2017 / 21:39