cron supervisord

Usando supervisor como CRON



supervisord (3)

¿Hay alguna manera de configurar al supervisor para que ejecute algún comando cada X segundos (como CRON)?

Veo un ejemplo con eventlistener y TICK_ event

[eventlistener:memmon] command=memmon -a 200MB -m [email protected] events=TICK_60

Pero ejecuta el comando solo una vez.


Problema

Como ve en el ejemplo de memmon, supervisord no está ejecutando memmon -a 200MB -m [email protected] en cada evento. Más bien, está iniciando este detector de eventos una vez (o potencialmente algunas veces si configura un grupo) y luego envía cada evento nuevo a través de la entrada estándar de un proceso existente.

Solución

En consecuencia, realmente necesita encontrar o escribir un oyente de eventos compatible con el supervisor para cada tipo adicional de capacidad que desee activar en los eventos.

Ejemplo de método de implementación

Configura la configuración y escribe un oyente

escriba una sección de evento supervisord.cfg

[eventlistener:passthru] command=/tmp/simple.py /bin/date -u +"%%s %%S:%%H:%%d:%%m" events=TICK_60

(nota- el escape de % para configParser )

escribe un oyente de eventos simple.py

Cree este oyente simple.py realizando cambios en el oyente de ejemplo desde los documentos para que ejecute su primer argumento con los argumentos restantes:

#! /usr/bin/python import sys import subprocess def write_stdout(s): sys.stdout.write(s) sys.stdout.flush() def write_stderr(s): sys.stderr.write(s) sys.stderr.flush() def main(args): while 1: write_stdout(''READY/n'') # transition from ACKNOWLEDGED to READY line = sys.stdin.readline() # read header line from stdin write_stderr(line) # print it out to stderr headers = dict([ x.split('':'') for x in line.split() ]) data = sys.stdin.read(int(headers[''len''])) # read the event payload res = subprocess.call(args, stdout=sys.stderr); # don''t mess with real stdout write_stderr(data) write_stdout(''RESULT 2/nOK'') # transition from READY to ACKNOWLEDGED if __name__ == ''__main__'': main(sys.argv[1:]) import sys

Asegúrate de que la configuración del supervisor funcione

$ supervisorctl [-c cfg] supervisor> status passthru RUNNING pid 4471, uptime 0:00:32 supervisor> tail passthru OKREADY RESULT 2 OKREADY ... supervisor> tail passthru stderr supervisor> tail passthru stderr ver:3.0 server:supervisor serial:0 pool:passthru poolserial:0 eventname:TICK_60 len:15 1451411161 01:17:29:12 <--- output when:1451411160ver:3.0 server:supervisor serial:1 pool:passthru poolserial:1 eventname:TICK_60 len:15 1451411220 00:17:29:12 <--- output when:1451411220

Ahora date -u +"%s %S:%H:%d:%m" se ejecuta cada 60 segundos.

Intercambio en el comando deseado

crear un script ejecutable

/tmp/hiworld.php:

#! /usr/bin/php <?= "hiya/n";

(chmod + x ...)

cambiar los argumentos del oyente en supervisord.cfg

[eventlistener:passthru] command=/tmp/simple.py /tmp/hiworld.php ;stdout_logfile=/tmp/passthru events=TICK_60 ;autorestart=true ;startsecs=0

vuelva a cargar la supervisión y la prueba (la nueva lectura parece no detectar este cambio)

supervisor> reload Really restart the remote supervisord process y/N? y Restarted supervisord supervisor> status passthru RUNNING pid 6017, uptime 0:00:10 supervisor> tail passthru stderr supervisor> status passthru RUNNING pid 6017, uptime 0:00:21 supervisor> status passthru RUNNING pid 6017, uptime 0:01:01 supervisor> tail passthru stderr ver:3.0 server:supervisor serial:316 pool:passthru poolserial:0 eventname:TICK_60 len:15 hiya when:1418926740 supervisor>

Fin

Ahora el comando deseado se ejecuta cada 60 segundos. Ahora le leen para ajustar detalles de permisos, ubicaciones, registros, etc.


¿Por qué inventar la rueda? Puede usar cron y supervisord juntos.

En supervisión, cree una tarea con autostart=false

En cron, use * * * * * supervisorctl start <taskname> para iniciar la tarea cada minuto