簡體   English   中英

如何使用 Python 檢查 Celery/Supervisor 是否正在運行

[英]How to check if Celery/Supervisor is running using Python

如果 celery 在機器(Ubuntu)上運行,如何用 Python 編寫輸出腳本?

我的用例。 我有一個包含一些任務的簡單 python 文件。 我沒有使用 Django 或 Flask。 我使用主管來運行任務隊列。 例如,

任務.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

這一切都有效,我現在想要一個頁面來檢查 celery/supervisor 進程是否正在運行。 即這樣的事情可能使用 Flask 允許我托管頁面,提供 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()

2020 年 9 月更新:Jérôme 在此處更新了 Celery 4.3 的答案: https ://stackoverflow.com/a/57628025/1159735

您可以通過導入celery.bin.celery包通過代碼運行celery status命令:

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...')

使用 subprocess 怎么樣,不確定它是否是一個好主意:

>>> 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]

您甚至可以查看那篇文章的源代碼以獲取實現您自己的想法的想法。

靈感來自@vgel 的回答,使用 Celery 4.3.0。

import celery
import celery.bin.base
import celery.bin.control
import celery.platforms

# Importing Celery app from my own application
from my_app.celery import app as celery_app


def celery_running():
    """Test Celery server is available

    Inspired by https://stackoverflow.com/a/33545849
    """
    status = celery.bin.control.status(celery_app)
    try:
        status.run()
        return True
    except celery.bin.base.Error as exc:
        if exc.status == celery.platforms.EX_UNAVAILABLE:
            return False
        raise


if __name__ == '__main__':
    if celery_is_up():
        print('Celery up!')
    else:
        print('Celery not responding...')

這不適用於 celery,但對於任何到這里查看 supervisord 是否正在運行的人,請檢查在您的supervisord.conf配置文件中為 supervisord 定義的 pidfile 是否存在。 如果是這樣,它正在運行; 如果不是,那就不是。 默認的pidfile是/tmp/supervisord.pid,這是我下面使用的。

import os
import sys

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

根據我的經驗,我會設置一條消息來跟蹤它是否完成,以便隊列負責重試任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM