2015-10-30 36 views
15

Jak napisać skrypt w Pythonie, który działa, gdy seler działa na komputerze (Ubuntu)?Jak sprawdzić, czy Seler/Supervisor działa przy pomocy Pythona

Mój przypadek użycia. Mam prosty plik python z niektórymi zadaniami. Nie używam Django ani Flask. Używam nadzoru, aby uruchomić kolejkę zadań. Na przykład,

tasks.py

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

Promotor:

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

To wszystko działa, teraz chce mieć stronę, która sprawdza, czy proces seler/kierownik pracuje. np. coś takiego może za pomocą Flask pozwala mi hostować stronę dającą status 200 pozwalający mi załadować saldo.

Na przykład ...

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

Odpowiedz

17

można uruchomić celery status komenda za pośrednictwem kodu poprzez zaimportowanie pakietu 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

Nie mam żadnych głosów na dzisiaj, więc aktualizuję tę metodę komentarzem. – sobolevn

+0

Nie sądzę, że 'app = selekcja.Cellilla (" zadania ", broker = 'redis: //')' linia jest niezbędna. Zmienna 'app' nie jest używana nigdzie indziej. – djromero

+0

@djromero minęło trochę czasu, odkąd sprawdziłem, jak to działa, ale IIRC jest potrzebne do utworzenia instancji aplikacji singleton w bibliotekach wewnętrznych. Nie powinno być potrzebne, jeśli używasz selera gdzieś indziej i tworzy on instancję selera. – Rotten194

2

Jak na temat korzystania podproces, nie wiem, czy to jest dobry pomysł:

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

Z mojego doświadczenia wynika, że ​​ustawiłem komunikat do śledzenia, czy był kompletny, czy nie, aby kolejki były odpowiedzialne za ponawianie zadań.

2

można analizować process state z supervisorctl status wyjściu

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

rzadki interfejs WWW pochodzi z przełożonym. Może możesz tego użyć. Można go włączyć w konfiguracji administratora. Kluczem do wyszukania jest [inet_http_server]

Można nawet spojrzeć na kod źródłowy tego fragmentu, aby uzyskać pomysły na wdrożenie własnego.

0

Wydaje się, że ta linia w Rotten194 's answer:

status.app = status.get_app() 

powinny być

status.app = status.get_app(app) 
0

ten nie ma zastosowania do selera, ale dla każdego, który zakończył się tutaj, aby zobaczyć, czy supervisord jest uruchomiony, sprawdź, czy plik pidfile zdefiniowany dla supervisora ​​w pliku konfiguracyjnym supervisord.conf istnieje. Jeśli tak, to działa; jeśli nie, to nie jest. Domyślnym plikiem pid jest /tmp/supervisord.pid, który użyłem poniżej.

import os 
import sys 

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