2015-10-30 13 views
15

Làm thế nào để viết một tập lệnh bằng Python xuất ra nếu cần tây đang chạy trên máy (Ubuntu)?Cách kiểm tra xem Celery/Supervisor có đang chạy bằng Python

Trường hợp sử dụng của tôi. Tôi có một tập tin python đơn giản với một số nhiệm vụ. Tôi không sử dụng Django hay Flask. Tôi sử dụng người giám sát để chạy hàng đợi nhiệm vụ. Ví dụ,

tasks.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 

này tất cả các công trình, bây giờ tôi muốn có trang mà kiểm tra nếu quá trình cần tây/người giám sát đang chạy. tức là một cái gì đó như thế này có thể sử dụng Flask cho phép tôi lưu trữ trang cho một trạng thái 200 cho phép tôi tải cân bằng.

Ví dụ ...

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

Trả lời

17

Bạn có thể chạy celery status lệnh qua mã bằng cách nhập gói 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...') 
+3

Tôi không có bất kỳ phiếu bầu nào còn lại cho ngày hôm nay, vì vậy tôi đang upvoting phương pháp này bằng nhận xét. – sobolevn

+0

Tôi không nghĩ rằng 'app = celery.Celery ('nhiệm vụ', môi giới = 'redis: //')' dòng là cần thiết. Biến 'app' không được sử dụng ở bất kỳ nơi nào khác. – djromero

+0

@ djromero nó được một lúc kể từ khi tôi kiểm tra như thế nào này làm việc, nhưng IIRC nó cần thiết để nhanh chóng ứng dụng singleton trong internals thư viện. Nó không nên cần thiết nếu bạn sử dụng cần tây ở một nơi khác và nó tạo ra thể hiện cần tây. – Rotten194

2

Làm thế nào về việc sử dụng tiến trình con, không chắc chắn nếu nó là một ý tưởng tốt:

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

Theo kinh nghiệm của mình, tôi sẽ đặt một thông báo để theo dõi xem nó có đầy đủ hay không để các hàng đợi có trách nhiệm thử lại các tác vụ.

2

bạn có thể phân tích process state từ supervisorctl status đầu ra

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' 
1

Một giao diện người dùng web thưa thớt đi kèm với người giám sát. Có thể bạn có thể sử dụng điều đó. Nó có thể được kích hoạt trong cấu hình giám sát. Chìa khóa cần tìm là [inet_http_server]

Bạn thậm chí có thể xem mã nguồn của đoạn đó để có ý tưởng để triển khai ý tưởng của riêng bạn.

0

Dường như dòng này trong Rotten194 's answer:

status.app = status.get_app() 

nên

status.app = status.get_app(app) 
0

Đây không phải là áp dụng cho cần tây, nhưng đối với bất cứ ai mà đã kết thúc vào đây để xem nếu supervisord đang chạy, kiểm tra xem pidfile được định nghĩa cho supervisord trong tệp cấu hình supervisord.conf của bạn có tồn tại không. Nếu có, nó đang chạy; nếu không, thì không. Pidfile mặc định là /tmp/supervisord.pid, đó là những gì tôi đã sử dụng bên dưới.

import os 
import sys 

if os.path.isfile("/tmp/supervisord.pid"): 
    print "supervisord is running." 
    sys.exit() 
Các vấn đề liên quan