2015-08-20 30 views
8

Ho usato pm2 per il mio script Node.js e lo adoro.
Ora ho uno script python che raccoglie i dati di streaming su EC2. A volte la sceneggiatura esplode e vorrei che un responsabile dei processi si riavvii come pm2.Come eseguire uno script python come pm2 per nodejs

C'è qualcosa come pm2 per python? Ho cercato in giro e non ho trovato nulla.

Ecco il mio errore

File "/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py", line 430, in filter 
    self._start(async) 
    File "/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py", line 346, in _start 
    self._run() 
    File "/usr/local/lib/python2.7/dist-packages/tweepy/streaming.py", line 286, in _run 
    raise exception 
AttributeError: 'NoneType' object has no attribute 'strip' 
/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:90: 

tratta di una semplice raccolta di dati di script

class StdOutListener(StreamListener): 

    def on_data(self, data): 
     mydata = json.loads(data) 
     db.raw_tweets.insert_one(mydata) 
     return True 

    def on_error(self, status): 
     mydata = json.loads(status) 
     db.error_tweets.insert_one(mydata) 


if __name__ == '__main__': 

    #This handles Twitter authetification and the connection to Twitter Streaming API 
    l = StdOutListener() 
    auth = OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_token, access_token_secret) 
    stream = Stream(auth, l) 

    #This line filter Twitter Streams to capture data by the keywords: 'python', 'javascript', 'ruby' 
    stream.filter(follow=['']) 

che vorrei che per riavviare solo se stesso nel caso in cui succede qualcosa.

+1

Posso suggerire http://supervisord.org/ –

risposta

2

UPD: vedere le risposte di seguito per soluzioni migliori.

-

Ci sono diverse soluzioni per questo. Innanzitutto, è possibile utilizzare http://supervisord.org/ che è un sistema di controllo del processo universale decente, che include molte funzionalità predefinite, come avvio automatico, contatore di riavvio, registrazione, configurazione flessibile e altro.

Oltre a ciò, è possibile racchiudere la logica di implementazione in una funzione, eseguirla all'interno del blocco try except, rilevare tutte le eccezioni e, quando si verifica un'eccezione, eseguire nuovamente la funzione anziché uscire dallo script. Nel tuo caso tale funzione potrebbe includere la creazione di listener, autenticazione e streaming.

27

Si può effettivamente eseguire script python dall'interno PM2:

pm2 start echo.py 

Se lo script termina con un suffisso .py userà un interprete Python per impostazione predefinita. Se il nome del file non finisce in .py si può fare:

pm2 start echo --interpreter=python 

ho trovato che devi essere un po 'attenti che Python si sta utilizzando, soprattutto se si utilizza un pitone virtualenv con un diverso versione al python 'default' sulla tua macchina.

+0

I ha avuto problemi nell'esecuzione in ambienti virtuali. PM2 ha sempre cercato di eseguire il python "globale" quando ha incontrato l'estensione ".py". Ho rimosso il ".py" e ho specificato l'interprete con successo. – slightlynybbled

+1

Eventuali risorse/articoli su come servire il contenuto web Python tramite pm2? Non dovrebbe essere possibile sostituire uwsgi con pm2? – Jonathan

2

PM2 è sufficiente, viene attivata interprete dal suffisso:

{ 
    ".sh": "bash", 
    ".py": "python", 
    ".rb": "ruby", 
    ".coffee" : "coffee", 
    ".php": "php", 
    ".pl" : "perl", 
    ".js" : "node" 
} 
1

Nel mio caso io uso scrapyd nel mio progetto. Il comando originale è:

scrapyd --pidfile /var/log/scrapyd/twistd.pid -l /var/log/scrapyd/logs/scrapyd.log

e la versione PM2 è:

pm2 start scrapyd --interpreter python --watch --name=scrapyd -- --pidfile "/var/log/scrapyd/twistd.pid" -l "/var/log/scrapyd/logs/scrapyd.log"

speranza questo esempio può aiutare

Problemi correlati