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

Gibt es etwas Ähnliches wie pm2 für Python? Ich habe mich umgesehen 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 Datenerfassungsskript

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 möchte, dass es sich einfach neu startet, falls etwas passiert.

39
toy 20 Aug. 2015 im 23:31

6 Antworten

Beste Antwort

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

-

Dafür gibt es mehrere Lösungen. Zunächst können Sie http://supervisord.org/ verwenden, ein anständiges universelles Prozesssteuerungssystem, das a Viele sofort einsatzbereite Funktionen wie Autorestart, Neustartzähler, Protokollierung, flexible Konfiguration und mehr.

Darüber hinaus können Sie Ihre Implementierungslogik einfach in eine Funktion einbinden, sie im Block try except ausführen, alle Ausnahmen abfangen und die Funktion erneut ausführen, anstatt das Skript zu beenden. In Ihrem Fall kann eine solche Funktion das Erstellen eines Listeners, einer Authentifizierung und eines Stream-Teils umfassen.

3
abcdn 25 Okt. 2017 im 19:53

Ich habe eine Echosystemdatei ecosystem.config.json erstellt

{
    "apps": [{
        "name": "app_name",
        "script": "/the/app/path/my_app.py",
        "args": ["-c", "my_config.prod.json"],
        "instances": "1",
        "wait_ready": true,
        "autorestart": false,
        "max_restarts": 5,
        "interpreter" : "/path/to/venv/bin/python",
    }]
}

Führen Sie den pm2-Dienst aus:

$ pm2 start ecosystem.config.json
$ pm2 -v
3.2.8
3
jjmerelo 13 Okt. 2019 im 16:41

In meinem Fall verwende ich Scrapyd in meinem Projekt. 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"

Ich hoffe, dieses Beispiel kann helfen

1
天才小飞猫 10 Nov. 2016 im 13:06

Sie können Python-Skripte tatsächlich in pm2 ausführen:

pm2 start echo.py

Wenn das Skript mit dem Suffix .py endet, wird standardmäßig ein Python-Interpreter verwendet. Wenn Ihr Dateiname nicht mit .py endet, können Sie Folgendes tun:

pm2 start echo --interpreter=python

Ich habe festgestellt, dass Sie ein wenig vorsichtig sein müssen, welche Python Sie verwenden, insbesondere wenn Sie eine virtuelle Python-Version mit einer anderen Version als der Standard-Python auf Ihrem Computer verwenden.

64
Simon Smith 9 Dez. 2015 im 21:32

PM2 mit Pipenv

Für diejenigen, die versuchen, ein Python-Programm von / mit pipenv auszuführen, versuchen Sie eine pm2.config.json (oder ökosystem.json.config wie in der offiziellen Dokumentation von PM2) so:

Die wichtigen Teile sind "interpreter" : "pipenv" und "interpreter_args": "run python3".

pm2.config.json

{
    "apps": [{
        "name": "BackupService",
        "script": "/home/service-backup/service/server.py",
        "args": [""],
        "wait_ready": true,
        "autorestart": false,
        "max_restarts": 5,
        "interpreter" : "pipenv",
        "interpreter_args": "run python3"
    }]
}

Dann pm2 start pm2.config.json. Ich habe immer pm2 delete BackupService (oder wie auch immer Sie es in "Name" nennen), bevor ich erneut beginne, da selbst mit dem Flag --update-env kein aktualisiertes pm2.config.json verwendet wird. Ich weiß nicht warum.

Beachten Sie auch, dass "interpreter_args" gemäß den neuesten PM2-Dokumenten anscheinend in "node_args" geändert wurde. Ich verwende pm2 --version 3.0.0 und der alte Weg funktioniert immer noch.

PM2 mit Python-Multiprocessing

Wenn Sie ein Python-Programm ausführen möchten, das Pythons Multiprocessing Lib verwendet, besteht die Lösung darin, die Ausführung im Fork -Modus zu erzwingen. Wenn nicht anders angegeben, versucht PM2 automatisch, es im cluster -Modus auszuführen.

Ich vermute jedoch, dass wir den Multiprozessor-Teil vollständig Python überlassen müssen. Ich kann mir nicht vorstellen, dass PM2 in der Lage ist, die mehreren Prozesse zu verwalten, die durch die Mehrfachverarbeitung von Python erzeugt werden - was es versucht, wenn es im cluster -Modus ausgeführt wird. Wenn Sie die Option "interpreter" verwenden (z. B. für pipenv), funktioniert gemäß den PM2-Dokumenten nur fork_mode.

Fügen Sie also "exec_mode": "fork" zu Ihrem pm2.config.json hinzu, damit es ausgeführt wird.

Wenn Sie keine pm2.config.json -Datei verwenden, sollte die Übergabe von -i 0 an pm2 start auch den Gabelmodus erzwingen. (-i steht für Instanzen)

5
anarchist912 2 Mai 2019 im 11:19

PM2 ist genug, es wird Interpreter mit Suffix ausführen:

{
  ".sh": "bash",
  ".py": "python",
  ".rb": "ruby",
  ".coffee" : "coffee",
  ".php": "php",
  ".pl" : "perl",
  ".js" : "node"
}
9
Nokey 29 Sept. 2016 im 02:49