web-dev-qa-db-ja.com

nodejsのpm2のようなpythonスクリプトを実行する方法

Node.jsスクリプトにpm2を使用しましたが、とても気に入っています。
今、EC2でストリーミングデータを収集するpythonスクリプトがあります。スクリプトが爆発することがあり、pm2のようにプロセスマネージャーを再起動してください。

Pythonにはpm2と同じものがありますか?私はあちこち探していて、何も見つかりませんでした。

これが私のエラーです

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

何かが起こった場合に備えて、それ自体を再起動してほしい。

19
toy

UPD:より良いソリューションについては、以下の回答をご覧ください。

-

それにはいくつかの解決策があります。まず、 http://supervisord.org/ を使用できます。これは、自動再起動、再起動カウンター、ロギング、柔軟性など、すぐに使える多くの機能を備えた、まともな汎用プロセス制御システムです。構成など。

それを超えて、実装ロジックを関数にラップし、try exceptブロック内で実行し、すべての例外をキャッチし、例外が検出されたら、スクリプトを終了する代わりに関数を再度実行します。あなたの場合、そのような機能には、リスナー、認証、およびストリーム部分の作成が含まれます。

1
abcdn

実際にpm2内からpythonスクリプトを実行できます。

pm2 start echo.py

スクリプトが.pyサフィックスで終わる場合、デフォルトでpythonインタープリターを使用します。ファイル名が.pyで終わっていない場合は、次のようにできます。

pm2 start echo --interpreter=python

特に、virtualenv pythonを別のバージョンで使用している場合は、使用しているpython 'default' pythonマシン上。

58
Simon Smith

PM2で十分です。サフィックスによってインタープリターを実行します。

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

私の場合、プロジェクトで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"

この例が役立つことを願って

1
天才小飞猫

PM2 with pipenv

pipenvから/を使用してpythonプログラムを実行しようとしている場合は、pm2.config.json(または公式のecosystem.json.configを試してくださいPM2のドキュメント)このような:

重要な部分は"interpreter" : "pipenv""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"
    }]
}

次にpm2 start pm2.config.jsonpm2 delete BackupServiceフラグを使用しても、更新された--update-envを使用しないため、再度開始する前に、常にpm2.config.json(または「名前」で呼び出す名前)を使用します。理由がわかりません。

また、最新のPM2ドキュメントによると、"interpreter_args""node_args"に変更されているようです。 pm2 --version 3.0.0を実行していますが、古い方法は引き続き機能します。

PM [with Python multiprocessing

Pythonのマルチプロセッシングライブラリを使用するpythonプログラムを実行する場合、解決策はforkモードで強制的に実行することです。 PM2は、特に指示がない限り、自動的にclusterモードで実行しようとします。

ただし、マルチプロセッシングパーツはPythonに完全に任せる必要があると思います。 PM2がPythonのマルチプロセッシングによって生成される複数のプロセスを管理できるとは想像できません。これは、clusterモードで実行しているときに試行されます。また、"interpreter"オプションを使用する場合(たとえばpipenvの場合)、PM2のドキュメントによると、fork_modeのみが機能します。

したがって、"exec_mode": "fork"pm2.config.jsonに追加して実行します。

pm2.config.jsonファイルを使用しない場合、-i 0pm2 startに渡すと、フォークモードも強制されます。 (-iはインスタンスを表します)

1
anarchist912

Echosystemファイルを作成しました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",
    }]
}

Pm2サービスを実行します。

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