Na minha organização, temos vários processos de trabalho que consomem fila. No momento, estamos usando o SupervisorD para gerenciá-los, mas gostaríamos de usar o SystemD, se possível, para determinadas vantagens. Tenho bastante experiência em escrever unidades personalizadas, mas não tenho imediatamente um analógico no SystemD para isso.
Na documentação do SupervisorD,numprocs
é detalhado um parâmetro chamado que permite definir o número de processos que eles gostariam de iniciar com o serviço. Se eu quero que 30 processos sejam iniciados, é uma alteração de uma linha.
Existe uma configuração nas unidades SystemD que permita especificar quantos desses processos eu gostaria de iniciar?
systemd
supervisord
Naftuli Kay
fonte
fonte
Respostas:
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 desordeiro, mas tem vantagens, como poder desligar um deles se estiver se comportando mal e não precisar desligá-lo. Também há 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.Seu conteúdo pode se parecer com:
Em seguida, começar com
systemctl start [email protected]
,systemctl start [email protected]
.Os processos iniciados terão a seguinte aparência:
Observe que ele
%I
foi substituído pelo que você colocou depois de@
quando o iniciou.Você pode iniciar todos os 30 com um pouco de shell-fu:
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 coisas que você pode fazer para facilitar o gerenciamento: talvez você não queira usar
test@{1..30}.service
para gerenciar todos eles. É um pouco pesado. Você pode criar um novo destino para o seu serviço.Crie
/etc/systemd/system/test.target
com:Em seguida, ajuste o
/etc/systemd/system/[email protected]
para que fique parecido com:Recarregue systemd com
systemctl daemon-reload
(necessário apenas se você estiver modificando o arquivo da unidade e não pular a versão anterior). E agora habilite todos os serviços que você deseja que sejam gerenciadossystemctl enable test@{1..30}.service
.(Se você havia ativado o serviço anteriormente
WantedBy=multi-user.target
, desative-o primeiro para limpar a dependência)Agora você pode fazer
systemctl start test.target
esystemctl stop test.target
, e ele iniciará / parará todos os 30 processos.E, novamente, você pode habilitar a inicialização como qualquer outro arquivo unidade:
systemctl enable test.target
.fonte
Restart=on-failure
. Leia asystemd.service
página do manual para mais.Aqui está o meu exemplo usando um script python que é executado em um virtualenv:
/etc/systemd/system/[email protected]
Desativar:
sudo systemctl enable 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]
Verificar status:
sudo systemctl status my-worker@1
fonte