O SystemD gerou N processos?

O SystemD gerou N processos?

Na minha organização, temos vários processos de trabalho que consomem filas. Atualmente, estamos usando o SupervisorD para gerenciá-los, mas gostaríamos de usar o SystemD, se possível, para obter certas vantagens. Tenho bastante experiência em escrever unidades personalizadas, mas não tenho imediatamente um análogo no SystemD para isso.

NoDocumentação do SupervisorDé detalhado um parâmetro chamado numprocsque permite definir a quantidade de processos que desejam iniciar com o serviço. Se eu quiser que 30 processos sejam iniciados, é uma mudança de uma linha.

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

Responder1

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

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

Seu conteúdo pode ser parecido com:

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

[Install]
WantedBy=multi-user.target

Então comece com , . Os processos iniciados serão semelhantes a:systemctl start [email protected]systemctl start [email protected]

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 %Ifoi substituído por tudo o que você colocou depois de @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 habilitá-los na inicialização como qualquer serviço normal: .systemctl enable [email protected]

 

Agora, o que eu quis dizer com coisas que você pode fazer para facilitar o gerenciamento: talvez você não queira usar test@{1..30}.servicepara gerenciar todas elas. É um pouco pesado. Em vez disso, você pode criar um novo destino para o seu serviço.

Crie /etc/systemd/system/test.targetcom:

[Install]
WantedBy=multi-user.target

Em seguida, ajuste para que fique assim:/etc/systemd/system/[email protected]

[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 ignorado a versão anterior dele). E agora habilite todos os serviços que você deseja gerenciar fazendo systemctl enable test@{1..30}.service.
(Se você já havia ativado o serviço enquanto ele estava disponível WantedBy=multi-user.target, desative-o primeiro para eliminar a dependência)

Agora você pode fazer systemctl start test.targete systemctl stop test.targete iniciar/parar todos os 30 processos.
E novamente, você pode ativar na inicialização como qualquer outro arquivo de unidade: systemctl enable test.target.

Responder2

Aqui está meu exemplo usando um script python 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 disable my-worker\@{1..30}.service

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

Recarregar:sudo systemctl daemon-reload

Começar:sudo systemctl start [email protected]

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

informação relacionada