python - periodic - celery schedulers
Cómo verificar si Celery/Supervisor se está ejecutando con Python (7)
¿Cómo escribir un script en Python que muestre si apio se ejecuta en una máquina (Ubuntu)?
Mi caso de uso. Tengo un simple archivo de python con algunas tareas. No estoy usando Django o Flask. Yo uso supervisor para ejecutar la cola de tareas. Por ejemplo,
tareas.py
from celery import Celery, task
app = Celery(''tasks'')
@app.task()
def add_together(a, b):
return a + b
Supervisor:
[program:celery_worker]
directory = /var/app/
command=celery -A tasks worker info
Todo esto funciona, ahora quiero tener una página que verifique si se está ejecutando el proceso de apio / supervisor. es decir, algo como esto, tal vez usando Flask, lo que me permite alojar la página y me da un estado de 200, lo que me permite cargar el saldo.
Por ejemplo...
check_status.py
from flask import Flask
app = Flask(__name__)
@app.route(''/'')
def status_check():
#check supervisor is running
if supervisor:
return render_template(''up.html'')
else:
return render_template(''down.html'')
if __name__ == ''__main__'':
app.run()
¿Qué hay de usar el subproceso? No estoy seguro de si es una buena idea:
>>> import subprocess
>>> output = subprocess.check_output(''ps aux''.split())
>>> ''supervisord'' in output
True
En mi experiencia, establecí un mensaje para hacer un seguimiento de si estaba completo o no, de modo que las colas serían responsables de volver a intentar las tareas.
Esto no es aplicable para el apio, pero para cualquiera que haya terminado aquí para ver si se está ejecutando supervisord, verifique si existe el archivo pid definido para supervisord en su archivo de configuración supervisord.conf
. Si es así, se está ejecutando; Si no, no lo es. El archivo pid predeterminado es /tmp/supervisord.pid, que es el que uso a continuación.
import os
import sys
if os.path.isfile("/tmp/supervisord.pid"):
print "supervisord is running."
sys.exit()
Parece que esta línea en la respuesta de Rotten194 :
status.app = status.get_app()
debiera ser
status.app = status.get_app(app)
Puede analizar el estado del proceso desde la salida de supervisorctl status
import subprocess
def is_celery_worker_running():
ctl_output = subprocess.check_output(''supervisorctl status celery_worker''.split()).strip()
if ctl_output == ''unix:///var/run/supervisor.sock no such file'':
# supervisord not running
return False
elif ctl_output == ''No such process celery_worker'':
return False
else:
state = ctl_output.split()[1]
return state == ''RUNNING''
Puede ejecutar el comando de celery status
través del código importando el paquete celery.bin.celery
:
import celery
import celery.bin.base
import celery.bin.celery
import celery.platforms
app = celery.Celery(''tasks'', broker=''redis://'')
status = celery.bin.celery.CeleryCommand.commands[''status'']()
status.app = status.get_app()
def celery_is_up():
try:
status.run()
return True
except celery.bin.base.Error as e:
if e.status == celery.platforms.EX_UNAVAILABLE:
return False
raise e
if __name__ == ''__main__'':
if celery_is_up():
print(''Celery up!'')
else:
print(''Celery not responding...'')
Una interfaz de usuario web dispersa viene con supervisor. Puede ser que puedas usar eso. Se puede habilitar en la configuración de supervisor. La clave a buscar es [inet_http_server]
Incluso puedes mirar el código fuente de esa pieza para obtener ideas para implementar el tuyo.