Как проверить, работает ли сельдерей/Супервизор с помощью Python

Как написать скрипт на Python, который выводит, если сельдерей работает на машине (Ubuntu)?

мой случай. У меня есть простой файл python с некоторыми задачами. Я не использую Django или Flask. Я использую supervisor для запуска очереди задач. Например,

tasks.py

from celery import Celery, task
app = Celery('tasks')
@app.task()
def add_together(a, b):
    return a + b

научный руководитель:

[program:celery_worker]
directory = /var/app/
command=celery -A tasks worker info

все это работает, теперь я хочу иметь страницу, которая проверяет, запущен ли процесс сельдерея / супервизора. то есть что-то вроде это, возможно, с помощью колбы, позволяющей мне разместить страницу, дающую статус 200, позволяющий мне балансировать нагрузку.

например...

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()

7 ответов


вы можете запустить celery status команда через код, импортируя 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...')

Как насчет использования подпроцесса, не уверен, что это хорошая идея:

>>> import subprocess
>>> output = subprocess.check_output('ps aux'.split())
>>> 'supervisord' in output
True

вы можете парсить процесс С 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'

разреженный веб-интерфейс пользователя поставляется с руководителем. Возможно, тебе это пригодится. Его можно включить в конфигурации супервизора. Ключ искать [inet_http_server]

вы даже можете посмотреть исходный код этой части, чтобы получить идеи для реализации своих собственных.


Кажется, что эта линия в Rotten194 ' s ответ:

status.app = status.get_app()

должно быть

status.app = status.get_app(app)

это не применимо для сельдерея, но для тех, кто оказался здесь, чтобы увидеть, работает ли supervisord, проверьте, определен ли pidfile для supervisord в вашем файл конфигурации. Если да, то он работает; если нет, то нет. По умолчанию используется файл / tmp / supervisord.pid, который я использовал ниже.

import os
import sys

if os.path.isfile("/tmp/supervisord.pid"):
    print "supervisord is running."
    sys.exit()

по моему опыту, я бы установил сообщение, чтобы отслеживать, было ли оно завершено или нет, чтобы очереди отвечали за повторные задачи.