tasks schedulers periodic python flask celery supervisor

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.