¿Cómo puedo configurar el programa administrado por el supervisor para esperar X segundos antes de intentar reiniciar?

9

Tengo un proceso de trabajo que procesa 1 mensaje RabbitMq a la vez. En este momento, tan pronto como el trabajador sale, el supervisor lo reinicia (lo que procesará el siguiente mensaje).

Me gustaría establecer un intervalo X segundos, para que el supervisor no se reinicie inmediatamente, sino que espere una cantidad de tiempo determinada antes de iniciar otro trabajador.

es posible? ¿Cómo?

loostro
fuente

Respuestas:

11

No hay forma de especificar el intervalo en la sección del programa supervisor, pero lo que puede hacer es poner "sleep ()" en su código para que después del programa espere un período de tiempo específico después de que termine con el procesamiento del mensaje.

Si no desea / no puede alterar el código del programa, puede intentar envolverlo en un script bash, por ejemplo:

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

Y modifique la sección de su programa supervisor para ejecutar ese script, en lugar de su programa:

command=/usr/local/bin/myprogram.sh
Jakov Sosic
fuente
¿El sueño no se ejecutará hasta que / usr / local / bin / myprogram regrese?
loostro
Exactamente, solo después de que mi programa salga, el sueño comenzará a contar.
Jakov Sosic
Un problema es que este script no maneja señales, en particular, TERM.
Torsten Bronger el
9

Necesitaba una forma simple de ejecutar un comando desde el interior de un contenedor acoplable, donde no hay cron. Esto es lo que estoy 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 asegura que el supervisor piense que el comando se inició correctamente incluso si sale después de unos segundos. De lo contrario, el supervisor dejará de reiniciarlo, pensando que está en un bucle.

Esto es lo que verías en /root/date.ts con el ejemplo anterior:

# 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 el sueño a su gusto y reemplace 'date >> / root / test.ts' con lo que necesite.

Esta solución también es útil si necesita ejecutar un trabajo cron con más frecuencia que cada minuto.

Luca Gibelli
fuente
+1 para la solución inteligente. Quiero hacer algo similar Desafortunadamente, esto no funciona para mí, ya que necesito obtener el código de salida en un escucha mediante una llamada RPC. Desafortunadamente, el supervisor reinicia el programa inmediatamente después de salir, haciendo que el código 0, suspire ... ¿Alguna otra idea?
Onema
0
[program:yourapp]
command = bash -c "sleep 60 && exec urcmd'
startsecs = 65 ; 

y entonces

supervisorctl -c your_config_file reload

1. necesita usar el execcomando, de lo contrario se bifurcará un subprogreso sleep 60 && exec your commandy su progreso se verá de la siguiente manera

$ 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

y luego, cuando usa supervisorctlpara detener urApp, detendrá el progreso 1818 y dejará 3872 un progreso huérfano

2.recomienda cambiar los segundos de inicio a 5 más que los segundos de suspensión, luego, cuando inicie esta aplicación y verifique el estado, le mostrará que está comenzando

$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

de lo contrario, si establece un valor menor que los segundos de suspensión, cuando inicie la aplicación y verifique el estado, obtendrá un estado de ejecución, pero aún está durmiendo cmd antes de la ejecución real

3.Cuando cambie su archivo de configuración, debe usar cmd de recarga o simplemente reiniciar su supervisor para que funcione

qingxin wang
fuente