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
El supervisor no es compatible con esto fácilmente.
Pero para lograr su objetivo, puede usar el supervisor para iniciar cron (para un contenedor de docker, por ejemplo):