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=[''])
何かが起こった場合に備えて、それ自体を再起動してほしい。
UPD:より良いソリューションについては、以下の回答をご覧ください。
-
それにはいくつかの解決策があります。まず、 http://supervisord.org/ を使用できます。これは、自動再起動、再起動カウンター、ロギング、柔軟性など、すぐに使える多くの機能を備えた、まともな汎用プロセス制御システムです。構成など。
それを超えて、実装ロジックを関数にラップし、try except
ブロック内で実行し、すべての例外をキャッチし、例外が検出されたら、スクリプトを終了する代わりに関数を再度実行します。あなたの場合、そのような機能には、リスナー、認証、およびストリーム部分の作成が含まれます。
実際にpm2内からpythonスクリプトを実行できます。
pm2 start echo.py
スクリプトが.pyサフィックスで終わる場合、デフォルトでpythonインタープリターを使用します。ファイル名が.pyで終わっていない場合は、次のようにできます。
pm2 start echo --interpreter=python
特に、virtualenv pythonを別のバージョンで使用している場合は、使用しているpython 'default' 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"
この例が役立つことを願って
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.json
。 pm2 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 0
をpm2 start
に渡すと、フォークモードも強制されます。 (-iはインスタンスを表します)
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