2015-08-20 3 views
8

Я использовал pm2 для моего сценария Node.js, и мне это нравится.
Теперь у меня есть скрипт python, который собирает потоковые данные на EC2. Иногда сценарий запускается, и я хотел бы, чтобы диспетчер процессов перезапустил себя, как pm2.Как запустить скрипт python как pm2 для nodejs

Есть ли что-то такое же, как pm2 для python? Я искал вокруг и ничего не мог найти.

Вот моя ошибка

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: 

Это простые данные, собирающие сценарий

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

То, что я хотел бы, чтобы просто перезагрузить себя в случае, если что-то случится.

+1

Могу ли я предложить http://supervisord.org/ –

ответ

2

UPD: см. Ответы ниже для получения более точных решений.

-

Для этого есть несколько решений. Во-первых, вы можете использовать http://supervisord.org/, который является достойной универсальной системой управления процессом, которая включает в себя множество функций из коробки, таких как автозапуск, счетчик перезапуска, протоколирование, гибкая настройка и многое другое.

Помимо этого вы можете просто превратить свою логику реализации в функцию, запустить ее в пределах блока try except, перехватить все исключения и при возникновении исключения запустить функцию снова, а не выйти из сценария. В вашем случае такая функция может включать создание функции прослушивания, аутентификации и потока.

27

Вы можете на самом деле запустить питон скрипты в PM2:

pm2 start echo.py 

Если сценарий заканчивается в .py суффикса он будет использовать интерпретатор питона по умолчанию. Если имя файла не заканчивается в .py вы можете сделать:

pm2 start echo --interpreter=python 

Я нашел, вы должны быть немного осторожным, который Python вы используете, особенно если вы используете virtualenv питона с другой версии на «python» по умолчанию на вашем компьютере.

+0

I были проблемы с запуском в виртуальных средах. PM2 всегда пытался выполнить «глобальный» python, когда он столкнулся с расширением «.py». Я удалил «.py» и успешно использовал интерпретатор. – slightlynybbled

+1

Любые ресурсы/статьи о том, как обслуживать веб-контент python через pm2? Нельзя ли заменить uwsgi на pm2? – Jonathan

2

PM2 достаточно, он будет работать переводчик суффиксом:

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

В моем случае я использую scrapyd в моем проекте. Оригинальный команда:

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

и версия пм2 является:

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

надежда этот пример может помочь

Смежные вопросы