toy*_*toy 22 python ubuntu process-management node.js python-2.7
我用过pm2
我的Node.js脚本,我喜欢它.
现在我有一个python脚本,它收集EC2上的流数据.有时脚本会爆炸,我希望进程管理器像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:
Run Code Online (Sandbox Code Playgroud)
这是一个简单的数据收集脚本
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=[''])
Run Code Online (Sandbox Code Playgroud)
我想它只是重新启动自己以防万一发生的事情.
小智 62
你可以从pm2中实际运行python脚本:
pm2 start echo.py
Run Code Online (Sandbox Code Playgroud)
如果脚本以.py后缀结尾,则默认情况下将使用python解释器.如果您的文件名不以.py结尾,您可以执行以下操作:
pm2 start echo --interpreter=python
Run Code Online (Sandbox Code Playgroud)
我发现你必须要小心你正在使用哪个python,特别是如果你使用的virtualenv python与你机器上的'default'python有不同的版本.
Sai*_*ful 11
我创建了一个 echosystem 文件 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",
}]
}
Run Code Online (Sandbox Code Playgroud)
运行 pm2 服务:
$ pm2 start ecosystem.config.json
$ pm2 -v
3.2.8
Run Code Online (Sandbox Code Playgroud)
ana*_*912 10
带pipenv的PM2
对于那些试图从/使用pipenv运行 python 程序的人,请尝试像这样的pm2.config.json(或如 PM2 的官方文档中的生态系统.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"
}]
}
Run Code Online (Sandbox Code Playgroud)
然后pm2 start pm2.config.json
。pm2 delete BackupService
在重新开始之前,我总是(或您在“名称”中称呼它的任何名称),因为即使使用--update-env
标志,它也不会使用更新的pm2.config.json
. 不知道为什么。
另请注意,根据最新的 PM2 文档,"interpreter_args"
, 似乎已更改为"node_args"
。我正在运行pm2 --version
3.0.0,旧方式仍然有效。
带有 Python 多处理的 PM2
如果要运行使用 Python 多处理库的 Python 程序,解决方案是强制以fork模式运行它。PM2,如果没有另外说明cluster
,它似乎会自动尝试在模式下运行它。
但是,我怀疑,我们需要将多处理部分完全留给 Python。我无法想象 PM2 能够管理由 Python 的多处理产生的多个进程——它在cluster
模式下运行时会尝试这样做。此外,根据 PM2 文档,当使用该"interpreter"
选项(例如用于 pipenv)时,仅fork_mode
会起作用。
所以添加"exec_mode": "fork"
到你的pm2.config.json
让它运行。
如果你不使用pm2.config.json
文件,传递-i 0
到也pm2 start
应该强制分叉模式。(-i 代表实例)
小智 8
PM2就够了,它将通过后缀运行解释器:
{
".sh": "bash",
".py": "python",
".rb": "ruby",
".coffee" : "coffee",
".php": "php",
".pl" : "perl",
".js" : "node"
}
Run Code Online (Sandbox Code Playgroud)
UPD:请参阅下面的答案以获得更好的解决方案。
——
有几种解决方案。首先,您可以使用http://supervisord.org/,这是一个不错的通用过程控制系统,它包括许多开箱即用的功能,例如自动重启、重启计数器、日志记录、灵活配置等。
除此之外,您可以将实现逻辑包装到一个函数中,在try except
块中运行它,捕获所有异常,当出现异常时,再次运行该函数而不是退出脚本。在您的情况下,此类功能可能包括创建侦听器、身份验证和流部分。
小智 5
您可以使用 nohup - Nohup 是 nohang-up 的缩写,是 Linux 系统中的一个命令,即使在退出 shell 或终端后也能保持进程运行。Nohup 阻止进程或作业接收 SIGHUP(信号挂起)信号。这是在关闭或退出终端时发送到进程的信号。下面给出了 nohup 命令的一些基础知识。
nohup mycommand
OR
nohup python3 -m flask run &
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29826 次 |
最近记录: |