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.
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.
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.
PM2 suffit, il exécutera interprète par suffixe:
{
".sh": "bash",
".py": "python",
".rb": "Ruby",
".coffee" : "coffee",
".php": "php",
".pl" : "Perl",
".js" : "node"
}
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
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