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 numprocs
que 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 service
arquivo 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 %I
foi 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}.service
para 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.target
com:
[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.target
e systemctl stop test.target
e 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