Como posso configurar o programa gerenciado do supervisord para esperar X segundos antes de tentar reiniciar?

7

Eu tenho um processo de trabalho que processa uma mensagem RabbitMq por vez. Agora, assim que o trabalhador sai, o supervisord está reiniciando (o que irá processar a próxima mensagem).

Eu gostaria de definir um intervalo X segundos, para que o supervisord não reinicie imidamente, mas aguarde um determinado período de tempo antes de iniciar outro trabalhador.

Isso é possível? Como?

    
por loostro 29.06.2014 / 20:34

3 respostas

9

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

Se você não quer / não pode alterar o código do programa, você pode tentar envolvê-lo no script bash, por exemplo:

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

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

command=/usr/local/bin/myprogram.sh
    
por 29.06.2014 / 22:22
8

Eu precisava de uma maneira simples de executar um comando de dentro de um contêiner 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

startsecs = 0 garante que o supervisor acha que o comando foi iniciado com sucesso, mesmo que saia depois de alguns segundos. Caso contrário, o supervisor parará de reiniciá-lo, achando que está em 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
[...]

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

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

    
por 17.11.2015 / 21:55
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 comando exec , caso contrário, ele criará um subprogress de sleep 60 && exec your command e seu progresso será semelhante ao 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 supervisorctl para parar o urApp, você irá parar o progresso 1818 e deixar 3872 um progresso órfão

2.recomendar para alterar o startsecs para 5 mais do que o sono segundos, em seguida, quando você iniciar este aplicativo e verificar o status, ele irá mostrar-lhe 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

else se você definir o valor a menos que o segundo do sono, quando você iniciar o aplicativo e verificar o status, você receberá um status de execução, mas ainda estará dormindo cmd antes da execução real

3. Quando você alterar o seu arquivo de configuração, você precisa usar o comando reload cmd ou apenas reiniciar o seu supervisord para fazê-lo funcionar

    
por 26.09.2017 / 12:37