Comment puis-je configurer le programme géré par supervisord pour attendre X secondes avant de tenter de redémarrer?

9

J'ai un processus de travail qui traite 1 message RabbitMq à la fois. En ce moment, dès que le travailleur quitte, le superviseur le redémarre (qui traitera le prochain message).

Je voudrais définir un intervalle de X secondes, afin que le superviseur ne redémarre pas immédiatement, mais il attend un certain temps avant de démarrer un autre travailleur.

Est-ce possible? Comment?

loostro
la source

Réponses:

11

Il n'y a aucun moyen de spécifier l'intervalle dans la section du programme du superviseur, mais ce que vous pourriez faire est de mettre "sleep ()" dans votre code afin qu'après le programme attend une période de temps spécifiée après avoir terminé avec le traitement des messages.

Si vous ne voulez pas / ne pouvez pas modifier le code du programme, vous pouvez essayer de l'envelopper dans un script bash, par exemple:

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

Et modifiez la section de votre programme de superviseur pour exécuter ce script, au lieu de votre programme:

command=/usr/local/bin/myprogram.sh
Jakov Sosic
la source
Le sommeil ne sera pas exécuté avant le retour de / usr / local / bin / myprogram?
loostro
Exactement, seulement après la fin de mon programme, le sommeil commencera à compter.
Jakov Sosic
Un problème est que ce script ne gère pas les signaux, en particulier, TERM.
Torsten Bronger du
9

J'avais besoin d'un moyen simple d'exécuter une commande à l'intérieur d'un conteneur Docker, où il n'y a pas de cron. Voici ce que j'utilise:

[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 garantit que le superviseur pense que la commande a été démarrée avec succès même si elle se termine après quelques secondes. Sinon, le superviseur arrêtera de le redémarrer, pensant qu'il est en boucle.

Voici ce que vous verriez dans /root/date.ts avec l'exemple ci-dessus:

# 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
[...]

Réglez le sommeil à votre goût et remplacez 'date >> / root / test.ts' par tout ce dont vous avez besoin.

Cette solution est également utile si vous devez exécuter un cronjob plus souvent que toutes les minutes.

Luca Gibelli
la source
+1 pour la solution intelligente. Je veux faire quelque chose de similaire. Malheureusement, cela ne fonctionne pas pour moi car j'ai besoin d'obtenir le code de sortie dans un écouteur à l'aide d'un appel RPC. Malheureusement, le superviseur redémarre le programme immédiatement après la sortie, rendant le code 0, soupirant ... D'autres idées?
Onema
0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

et alors

supervisorctl -c your_config_file reload

1. vous devez utiliser la execcommande, sinon elle générera une sous sleep 60 && exec your command-progression et votre progression ressemblera à ce qui suit

$ 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

puis lorsque vous utilisez supervisorctlpour arrêter urApp, vous arrêterez la progression 1818 et laisserez 3872 une progression orpheline

2.recommandez de changer les démarrages à 5 de plus que les secondes de sommeil, puis lorsque vous démarrez cette application et vérifiez l'état, il vous montrera que cela commence

$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

sinon, si vous définissez une valeur inférieure aux secondes de veille, lorsque vous démarrez l'application et vérifiez l'état, vous obtiendrez un état en cours d'exécution, mais il est toujours en veille cmd avant de s'exécuter réellement

3.Lorsque vous modifiez votre fichier de configuration, vous devez utiliser reload cmd ou simplement redémarrer votre supervord pour le faire fonctionner.

qingxin wang
la source