40

私はpm2自分の Node.js スクリプトに使用しており、気に入っています。
これで、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=[''])

何かあったときのために再起動してほしいということです。

4

7 に答える 7

101

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

pm2 start echo.py

スクリプトが .py サフィックスで終わる場合、デフォルトで Python インタープリターが使用されます。ファイル名が .py で終わらない場合は、次のことができます。

pm2 start echo --interpreter=python

特に、マシンの「デフォルト」のpythonとは異なるバージョンのvirtualenv pythonを使用している場合は、使用しているpythonに少し注意する必要があることがわかりました。

于 2015-12-09T21:32:30.777 に答える
14

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

{
  ".sh": "bash",
  ".py": "python",
  ".rb": "ruby",
  ".coffee" : "coffee",
  ".php": "php",
  ".pl" : "perl",
  ".js" : "node"
}
于 2016-09-29T02:49:37.510 に答える
11

エコーシステムファイルを作成しましたecosystem.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 ecosystem.config.json
$ pm2 -v
3.2.8
于 2019-01-16T13:48:30.503 に答える
10

pipenv を使用した PM2

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

重要な部分は"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.json。フラグを使用してpm2 delete BackupService--update-env更新されpm2.config.jsonた . 理由がわからない。

また、最新の PM2 ドキュメントによると、"interpreter_args"が に変更されたようです。"node_args"私はpm2 --version3.0.0 を実行していますが、古い方法でも動作します。

PM2 と Python マルチプロセッシング

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

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

"exec_mode": "fork"したがって、実行するにはあなたに追加してくださいpm2.config.json

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

于 2019-05-02T11:19:10.647 に答える
2

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

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

于 2016-11-10T13:06:01.127 に答える
2

Nohup を使用できます。 Nohup、no hang-up の略は、シェルまたはターミナルを終了した後でもプロセスを実行し続ける Linux システムのコマンドです。Nohup は、プロセスまたはジョブが SIGHUP (Signal Hang UP) シグナルを受信するのを防ぎます。これは、端末を閉じるか終了するときにプロセスに送信されるシグナルです。nohup の基本的なコマンドのいくつかを以下に示します。

 nohup mycommand

   OR

 nohup python3 -m flask run &
于 2020-03-05T06:19:33.123 に答える