2015-08-20 8 views
8

Ich habe pm2 für meine Node.js-Skript verwendet und ich liebe es.
Jetzt habe ich ein Python-Skript, das Streaming-Daten auf EC2 sammeln. Manchmal bombardiert das Skript und ich möchte, dass sich ein Prozessmanager wie PM2 neu startet.Wie führe ich ein Python-Skript wie pm2 für nodejs

Gibt es etwas Ähnliches wie PM2 für Python? Ich habe herumgesucht und konnte nichts finden.

Hier ist mein Fehler

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: 

Es ist ein einfaches Datenskript sammeln

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=['']) 

Dass ich es möchte nur selbst neu zu starten, falls etwas passiert.

+1

Darf ich vorschlagen, http://supervisord.org/ –

Antwort

2

UPD: Siehe Antworten unten für bessere Lösungen.

-

Dafür gibt es mehrere Lösungen. Zuerst können Sie http://supervisord.org/ verwenden, das ein anständiges universelles Prozesssteuerungssystem ist, das eine Menge von Funktionen wie Autorestart, Neustartzähler, Protokollierung, flexible Konfiguration und mehr enthält.

Darüber hinaus können Sie Ihre Implementierungslogik einfach in eine Funktion einfügen, sie innerhalb von try except blockieren, alle Ausnahmen abfangen und, wenn eine Ausnahme ausgelöst wird, die Funktion erneut ausführen, anstatt das Skript zu beenden. In Ihrem Fall könnte eine solche Funktion das Erstellen von Listener-, Authentifizierungs- und Streamteilen beinhalten.

27

Sie können tatsächlich Python-Skripte aus PM2 laufen:

pm2 start echo.py 

Wenn das Skript in einem Py Suffix endet wird es einen Python-Interpreter als Standard verwenden. Wenn Ihr Dateiname in Py endet nicht können Sie tun:

pm2 start echo --interpreter=python 

Ich habe festgestellt, müssen Sie ein wenig vorsichtig sein, die python Sie verwenden, vor allem, wenn Sie eine virtualenv Python mit einem anderen verwenden Version auf die 'Standard' Python auf Ihrem Rechner.

+0

I hatte Probleme in virtuellen Umgebungen zu laufen. PM2 hat immer versucht, das 'globale' Python auszuführen, als es die Erweiterung '.py' vorfand. Ich entfernte die '.py' und spezifizierte den Interpreter mit Erfolg. – slightlynybbled

+1

Gibt es irgendwelche Ressourcen/Artikel darüber, wie Python-Webinhalte über PM2 bereitgestellt werden? Sollte es nicht möglich sein, uwsgi durch pm2 zu ersetzen? – Jonathan

2

PM2 genug ist, wird es Interpreter von Suffix laufen:

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

In meinem Fall habe ich scrapyd in meinem Projekt verwenden. Der ursprüngliche Befehl lautet:

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

und die PM2 Version ist:

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

Hoffnung kann dieses Beispiel helfen