Как запустить скрипт python, такой как pm2 для nodejs

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

есть ли что-то такое же, как 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=[''])

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

4 ответов


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

--

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

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


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

pm2 start echo.py

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

pm2 start echo --interpreter=python

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


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

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

в моем случае я использую scrapyd в своем проекте. Исходная команда:

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

и версия pm2:

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

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