web-dev-qa-db-ja.com

Celery / SupervisorがPython)を使用して実行されているかどうかを確認する方法

セロリがマシン(Ubuntu)で実行されている場合に出力するスクリプトをPythonで作成するにはどうすればよいですか?

私のユースケース。いくつかのタスクを含む単純なpythonファイルがあります。DjangoまたはFlaskを使用していません。スーパーバイザーを使用してタスクキューを実行しています。たとえば、

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

これはすべて機能します。セロリ/スーパーバイザープロセスが実行されているかどうかを確認するページが必要です。つまり、このようなものはおそらく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()
18
Prometheus

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

サブプロセスを使用するのはどうですか、それが良い考えかどうかはわかりません:

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

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'
2
r-m-n

スパースなWebユーザーインターフェイスにはスーパーバイザーが付属しています。あなたはそれを使うことができるかもしれません。スーパーバイザ設定で有効にできます。探すべき鍵は[inet_http_server]です

その作品のソースコードを見て、独自のアイデアを実装することもできます。

1
gipsy

Rotten194の答え のこの行のようです:

status.app = status.get_app()

する必要があります

status.app = status.get_app(app)
0
Alex Hou

@ vgelの回答 に触発され、Celery4.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...')
0
Jérôme

これはセロリには適用されませんが、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()
0
Tom