2015-10-30 13 views
15

ile çalışıp çalışmadığı nasıl kontrol edilir? Kerelik bir makinede (Ubuntu) çalışıyorsa çıktı veren Python'da bir komut dosyası nasıl yazılır?Celery/Supervisor'un Python

Kullanım durumum. Bazı görevleri olan basit bir python dosyası var. Django veya Flask kullanmıyorum. Görev sırasını çalıştırmak için denetleyici kullanıyorum. Örneğin,

tasks.py

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

Danışman:

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

Bu tüm inşaat, şimdi kereviz/danışman işlemi çalışıyorsa denetler sayfasını sahip olmak istiyorum. Örneğin, Flask kullanarak belki de bana 200 sayfalık bir denge veren ve bana bilanço yüklememize izin veren bir sayfa sunmamı sağlayan bir şey. Örneğin

...

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

cevap

17

Kaçabilirsiniz celery status kod aracılığıyla celery.bin.celery paketini içe aktarın:

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

Bugün için herhangi bir vardiya yok, bu yüzden bir yorum ile bu yöntemi kaldırıyorum. – sobolevn

+0

Ben app = celery.Celery ('görevleri', komisyoncu = 'redis: //') 'hat gerekli olduğunu sanmıyorum. 'App' değişkeni başka bir yerde kullanılmaz. – djromero

+0

@djromero, bunun nasıl çalıştığını kontrol ettiğimden beri biraz zaman geçti, ancak IIRC'nin tektonik uygulamayı kütüphane içi içeriğinde gerçekleştirmesi gerekiyordu. Kerevizi başka bir yerde kullanırsanız ve kereviz örneğini yaratırsanız buna gerek yoktur. – Rotten194

2

Nasıl iyi bir fikir olduğundan emin değilse, alt işlemi kullanmayla ilgili:

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

Deneyimlerime göre, tamamlanmış olup olmadığını izlemek için bir ileti koyardım, böylece kuyrukları yeniden denemek için sıralar sorumlu olurdu.

2

A seyrek web kullanıcı arayüzü amiri ile birlikte gelir supervisorctl status çıkışı

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

den process state ayrıştırma yapabilir. Bunu kullanabilirsin. Denetimci yapılandırmasında etkinleştirilebilir. Aramak için anahtar [inet_http_server]

Kendi başınıza uygulamak için fikirler almak için o parçanın kaynak koduna bakabilirsiniz. ,

status.app = status.get_app() 

status.app = status.get_app(app) 
Bu kereviz için geçerli değildir
0

O Rotten194 's answer bu hat görünüyor supervisord.conf yapılandırma dosyanızdaki denetim görevlisi için tanımlanan pidfile olup olmadığını kontrol edin. Eğer öyleyse, koşuyor; değilse, öyle değil. Varsayılan pidfile aşağıda kullandığım /tmp/supervisord.pid'tir.

import os 
import sys 

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

ama supervisord yayınlanmakta olup olmadığını görmek için burada bitti herkes için olmalıdır: