Wie kann ich das von Supervisord verwaltete Programm so konfigurieren, dass es X Sekunden wartet, bevor es mit dem Neustart beginnt?

9

Ich habe einen Arbeitsprozess, der jeweils 1 RabbitMq-Nachricht verarbeitet. Sobald der Worker beendet wird, startet Supervisord ihn neu (wodurch die nächste Nachricht verarbeitet wird).

Ich möchte ein Intervall von X Sekunden festlegen, damit Supervisord nicht sofort neu startet, sondern eine bestimmte Zeit wartet, bevor ein anderer Mitarbeiter gestartet wird.

Ist das möglich? Wie?

loostro
quelle

Antworten:

11

Es gibt keine Möglichkeit, das Intervall im Abschnitt des Supervisor-Programms anzugeben. Sie können jedoch "sleep ()" in Ihren Code einfügen, damit das Programm nach Abschluss der Nachrichtenverarbeitung einen bestimmten Zeitraum wartet.

Wenn Sie den Programmcode nicht ändern möchten, können Sie versuchen, ihn in ein Bash-Skript zu verpacken, zum Beispiel:

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

Ändern Sie den Abschnitt Ihres Supervisor-Programms, um dieses Skript anstelle Ihres Programms auszuführen:

command=/usr/local/bin/myprogram.sh
Jakov Sosic
quelle
Der Ruhezustand wird erst ausgeführt, wenn / usr / local / bin / myprogram zurückkehrt?
Loostro
Genau nach dem Beenden von myprogram beginnt der Schlaf zu zählen.
Jakov Sosic
Ein Problem ist, dass dieses Skript keine Signale verarbeitet, insbesondere TERM.
Torsten Bronger
9

Ich brauchte eine einfache Möglichkeit, einen Befehl in einem Docker-Container auszuführen, in dem es kein Cron gibt. Folgendes verwende ich:

[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 stellt sicher, dass der Supervisor der Meinung ist, dass der Befehl erfolgreich gestartet wurde, auch wenn er nach einigen Sekunden beendet wird. Andernfalls wird der Supervisor den Neustart beenden und denken, dass er sich in einer Schleife befindet.

Folgendes würden Sie in /root/date.ts mit dem obigen Beispiel sehen:

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

Stellen Sie den Schlaf nach Ihren Wünschen ein und ersetzen Sie 'date >> / root / test.ts' durch alles, was Sie brauchen.

Diese Lösung ist auch praktisch, wenn Sie öfter als jede Minute einen Cronjob ausführen müssen.

Luca Gibelli
quelle
+1 für die clevere Lösung. Ich möchte etwas Ähnliches tun. Leider funktioniert dies bei mir nicht, da ich den Exit-Code in einem Listener mithilfe eines RPC-Aufrufs abrufen muss. Leider startet der Supervisor das Programm sofort nach dem Beenden neu und macht den Code 0, seufz ... Irgendwelche anderen Ideen?
Onema
0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

und dann

supervisorctl -c your_config_file reload

1. Sie müssen den execBefehl verwenden, andernfalls wird ein Unterfortschritt ausgelöst, sleep 60 && exec your commandund Ihr Fortschritt sieht wie folgt aus

$ 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

und wenn Sie dann supervisorctlurApp stoppen, stoppen Sie den Fortschritt von 1818 und lassen 3872 einen verwaisten Fortschritt

2. empfehlen, die Startsekunden auf 5 mehr als die Schlafsekunden zu ändern. Wenn Sie diese App starten und den Status überprüfen, wird angezeigt, dass sie startet

$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

Andernfalls erhalten Sie beim Starten der App und beim Überprüfen des Status einen laufenden Status, wenn Sie den Wert kleiner als die Schlafsekunden festlegen. Vor der tatsächlichen Ausführung wird jedoch noch cmd angezeigt

3.Wenn Sie Ihre Konfigurationsdatei ändern, müssen Sie cmd neu laden oder einfach Ihren Supervisord neu starten, damit es funktioniert

Qingxin Wang
quelle