web-dev-qa-db-fra.com

Comment exécuter un script python comme pm2 pour nodejs

J'ai utilisé pm2 pour mon script Node.js et je l'aime.
Maintenant, j'ai un script python qui collecte des données en streaming sur EC2. Parfois, le script explose et je voudrais qu'un gestionnaire de processus se redémarre comme pm2. 

Existe-t-il quelque chose de similaire à pm2 pour python? J'ai cherché autour et je n'ai rien trouvé.

Voici mon erreur 

  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:

C'est un simple script de collecte de données 

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

Je voudrais qu'il se redémarre au cas où quelque chose se produirait. 

14
toy

UPD: Voir les réponses ci-dessous pour de meilleures solutions.

-

Il y a plusieurs solutions pour cela. Tout d’abord, vous pouvez utiliser http://supervisord.org/ qui est un système de contrôle de processus universel décent, qui inclut de nombreuses fonctionnalités prêtes à l’emploi, telles que le redémarrage automatique, le compteur de redémarrage, la journalisation, la configuration flexible, etc. .

Au-delà de cela, vous pouvez simplement envelopper votre logique d'implémentation dans une fonction, l'exécuter dans un bloc try except, intercepter toutes les exceptions et, lorsqu'une exception est invoquée, réexécutez la fonction au lieu de quitter le script. Dans votre cas, une telle fonction peut inclure la création d’un écouteur, d’une authentification et d’une partie de flux.

2
abcdn

Vous pouvez réellement exécuter des scripts python à partir de pm2:

pm2 start echo.py

Si le script se termine par un suffixe .py, il utilisera un interpréteur python par défaut. Si votre nom de fichier ne finit pas par .py, vous pouvez faire:

pm2 start echo --interpreter=python

Nous avons constaté que vous deviez faire attention au type de python que vous utilisez, en particulier si vous utilisez un python virtualenv avec une version différente de celle utilisée par défaut sur votre machine. 

42
Simon Smith

PM2 suffit, il exécutera interprète par suffixe:

{
  ".sh": "bash",
  ".py": "python",
  ".rb": "Ruby",
  ".coffee" : "coffee",
  ".php": "php",
  ".pl" : "Perl",
  ".js" : "node"
}
6
Nokey

Dans mon cas, j'utilise scrapyd dans mon projet. La commande d'origine est:

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

et la version pm2 est:

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

espérons que cet exemple peut aider

1
天才小飞猫

J'ai créé un fichier ecosystème echosystem.config.json

{
    "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",
    }]
}

Exécutez le service pm2:

$ pm2 start echosystem.config.json
$ pm2 -v
3.2.8
1
Saiful