2015-10-30 17 views
15

Come scrivere uno script in Python che emette se il sedano è in esecuzione su una macchina (Ubuntu)?Come verificare se Celery/Supervisor è in esecuzione usando Python

La mia custodia. Ho un semplice file python con alcune attività. Non sto usando Django o Flask. Io uso supervisore per eseguire la coda delle attività. Ad esempio,

tasks.py

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

Relatore:

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

Questa tutte le opere, io ora voglio avere pagina che controlla se il processo di sedano/supervisore è in esecuzione. vale a dire qualcosa del genere forse usando Flask che mi permette di ospitare la pagina dando uno status 200 che mi permette di bilanciare il carico.

Per esempio ...

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

risposta

17

È possibile eseguire il Comando celery status tramite codice importando il pacchetto 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

Non ho più alcun upvotes per oggi, quindi sto inviando questo metodo a un commento. – sobolevn

+0

Non penso che 'app = celery.Celery ('tasks', broker = 'redis: //')' la riga è necessaria. La variabile 'app' non viene utilizzata da nessun'altra parte. – djromero

+0

@djromero è passato un po 'di tempo da quando ho controllato come funzionava, ma IIRC è necessario per istanziare l'app singleton negli interni della biblioteca. Non dovrebbe essere necessario se usi Celery da qualche altra parte e crea l'istanza di Celery. – Rotten194

2

Come sull'utilizzo sottoprocesso, non so se si tratta di una buona idea:

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

Nella mia esperienza, avrei impostato un messaggio per verificare se era completo o meno in modo che le code sarebbero state responsabili di riprovare le attività.

2

è possibile analizzare process state da supervisorctl status uscita

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

Un'interfaccia utente web sparse viene fornito con supervisore. Potresti usarlo. Può essere abilitato nella configurazione del supervisore. La chiave per cercare è [inet_http_server]

Si potrebbe anche guardare il codice sorgente di quel pezzo per ottenere idee per implementare il proprio.

0

Sembra che questa linea in Rotten194 's answer:

status.app = status.get_app() 

dovrebbe essere

status.app = status.get_app(app) 
0

Questo non è applicabile per il sedano, ma per chiunque che ha finito per qui per vedere se supervisord è in esecuzione, controllare se esiste il file pid definito per supervisord nel file di configurazione supervisord.conf. Se è così, è in esecuzione; se no, non lo è. Il file pid predefinito è /tmp/supervisord.pid, che è quello che ho usato sotto.

import os 
import sys 

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