Como posso configurar o programa gerenciado pelo supervisord para aguardar X segundos antes de tentar reiniciar?

9

Eu tenho um processo de trabalho que processa 1 mensagem RabbitMq de cada vez. No momento, assim que o trabalhador sai, a supervisord a reinicia (o que processará a próxima mensagem).

Eu gostaria de definir um intervalo X segundos, para que a supervisord não seja reiniciada por completo, mas aguarde um determinado período de tempo antes de iniciar outro trabalhador.

Isso é possível? Quão?

loostro
fonte

Respostas:

11

Não há como especificar o intervalo na seção do programa supervisor, mas o que você pode fazer é colocar "sleep ()" em seu código, para que o programa após aguarde um período especificado após o término do processamento da mensagem.

Se você não quiser / não puder alterar o código do programa, tente envolvê-lo no script bash, por exemplo:

#!/bin/bash
/usr/local/bin/myprogram
sleep 30

E altere a seção do programa supervisor para executar esse script, em vez do seu programa:

command=/usr/local/bin/myprogram.sh
Jakov Sosic
fonte
O sono não será executado até que / usr / local / bin / myprogram retorne?
Loostro 30/06
Exatamente, somente após a saída do meu programa, o sono começará a contar.
Jakov Sosic
Um problema é que esse script não lida com sinais, em particular, TERM.
Torsten Bronger 23/11/19
9

Eu precisava de uma maneira simples de executar um comando dentro de um contêiner de docker, onde não há cron. Aqui está o que estou usando:

[program:runevery]
directory = /my/workdir
command = sh -c "sleep 5;date >>/root/test.ts"
stdout_logfile = /var/log/supervisor/%(program_name)s.log
stderr_logfile = /var/log/supervisor/%(program_name)s.log
autorestart = true
startsecs = 0
exitcodes = 0,1,2

O startecs = 0 garante que o supervisor pense que o comando foi iniciado com êxito, mesmo que saia após alguns segundos. Caso contrário, o supervisor irá parar de reiniciá-lo, pensando que está em um loop.

Aqui está o que você veria em /root/date.ts com o exemplo acima:

# tail -f /root/test.ts 
Tue Nov 17 20:42:58 UTC 2015
Tue Nov 17 20:43:04 UTC 2015
Tue Nov 17 20:43:10 UTC 2015
[...]

Sintonize o sono ao seu gosto e substitua 'date >> / root / test.ts' pelo que você precisar.

Essa solução também é útil se você precisar executar um cronjob com mais frequência do que a cada minuto.

Luca Gibelli
fonte
+1 para a solução inteligente. Eu quero fazer algo semelhante. Infelizmente, isso não funciona para mim, pois preciso obter o código de saída em um ouvinte usando uma chamada RPC. Infelizmente, o supervisor reinicia o programa imediatamente após a saída, tornando o código 0, suspiro ... Alguma outra idéia?
Onema
0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

e depois

supervisorctl -c your_config_file reload

1. você precisa usar o execcomando, caso contrário ele irá bifurcar um subprogress sleep 60 && exec your commande seu progresso será como o seguinte

$ ps -ef|grep urcmd
work      1818  1698  0 17:35 ?        00:00:00 bash -c sleep 60 && urcmd
work      3872  1818  0 17:36 ?        00:00:00 urcmd

e quando você usa supervisorctlpara interromper o urApp, interrompe o progresso de 1818 e deixa 3872 um progresso órfão

2. recomendo alterar os segundos de inicialização para 5 a mais do que os segundos de suspensão; quando você iniciar este aplicativo e verificar o status, ele mostrará que está começando

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          STARTING  
otherapp                       RUNNING   pid 13502, uptime 0:00:55

$supervisorctl -c your_config_file status;echo;ps -ef|grep urcmd
urapp                          RUNNING   pid 13503, uptime 0:00:05
otherapp                       RUNNING   pid 13502, uptime 0:00:65

caso contrário, se você definir o valor como menor que os segundos de suspensão, ao iniciar o aplicativo e verificar o status, você obterá um status de execução, mas ainda estará dormindo cmd antes da execução real

3. quando você altera seu arquivo de configuração, é necessário usar o comando reload cmd ou apenas reiniciar sua supervisord para fazê-lo funcionar

qingxin wang
fonte