Come posso configurare il programma gestito da Supervord per attendere X secondi prima di provare a riavviare?


9

Ho un processo di lavoro che elabora 1 messaggio RabbitMq alla volta. In questo momento, non appena il lavoratore esce, supervisord lo riavvia (che elaborerà il messaggio successivo).

Vorrei impostare un intervallo di X secondi, in modo che supervisord non si riavvii immidamente, ma attende un determinato periodo di tempo prima di avviare un altro lavoratore.

È possibile? Come?

Risposte:


11

Non esiste alcun modo per specificare l'intervallo nella sezione del programma supervisore, ma ciò che si può fare è inserire "sleep ()" nel codice in modo che dopo che il programma attenda il periodo di tempo specificato dopo che termina con l'elaborazione dei messaggi.

Se non vuoi / non puoi modificare il codice del programma, puoi provare a racchiuderlo nello script bash, ad esempio:

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

E modifica la sezione del tuo programma supervisore per eseguire quello script, invece del tuo programma:

command=/usr/local/bin/myprogram.sh

La sospensione non verrà eseguita fino a quando / usr / local / bin / myprogram non ritorna?
loostro,

Esattamente, solo dopo l'uscita del mrogramma, il conteggio del sonno inizierà.
Jakov Sosic,

Un problema è che questo script non gestisce i segnali, in particolare TERM.
Torsten Bronger,

9

Avevo bisogno di un modo semplice per eseguire un comando dall'interno di un contenitore docker, dove non c'è cron. Ecco cosa sto 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

startecs = 0 assicura che il supervisore ritenga che il comando sia stato avviato correttamente anche se termina dopo alcuni secondi. Altrimenti il ​​supervisore smetterà di riavviarlo, pensando che sia in un ciclo.

Ecco cosa vedresti in /root/date.ts con l'esempio sopra:

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

Regola il sonno a tuo piacimento e sostituisci 'date >> / root / test.ts' con tutto ciò di cui hai bisogno.

Questa soluzione è utile anche se devi eseguire un cronjob più spesso di ogni minuto.


+1 per la soluzione intelligente. Voglio fare qualcosa di simile. Sfortunatamente, questo non funziona per me in quanto ho bisogno di ottenere il codice di uscita in un ascoltatore usando una chiamata RPC. Sfortunatamente, il supervisore riavvia il programma immediatamente dopo l'uscita, rendendo il codice 0, sospiro ... Altre idee?
Onema,

0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

e poi

supervisorctl -c your_config_file reload

1. è necessario utilizzare il execcomando, altrimenti verrà eseguito il fork di un sottoprocesso sleep 60 && exec your commande i tuoi progressi saranno i seguenti

$ 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 quindi quando si utilizza supervisorctlper interrompere urApp, si interromperanno i progressi 1818 e si lascerà 3872 un progresso orfano

2.consiglia di cambiare startecs a 5 in più rispetto ai secondi di sonno, quindi quando avvii questa app e controlli lo stato, ti mostrerà che sta iniziando

$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

altrimenti se imposti un valore inferiore ai secondi di sospensione, quando avvii l'app e ne controlli lo stato, otterrai uno stato in esecuzione, ma è ancora inattivo cmd prima dell'esecuzione reale

3.quando si modifica il file di configurazione, è necessario utilizzare ricaricare cmd o semplicemente riavviare il supervisord per farlo funzionare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.