我需要运行 python 脚本并确保它在终止后会重新启动。我知道有一个名为 supervisord 的 UNIX 解决方案。但不幸的是,我的脚本必须运行的服务器在 Windows 上。你知道什么工具有用吗?谢谢
6 回答
尽管这里有很大的免责声明,但您可以在 Windows 中使用Cygwin运行 Supervisor ;事实证明,Cygwin 在模拟 Posix 环境方面走了很长一段路,效果非常好,以至于实际上 supervisord 运行不变。无需学习新工具,如果您需要跨多个平台部署复杂的项目,您甚至可以节省大量工作。
这是我的食谱:
- 如果您还没有这样做,请安装 Cygwin。在安装过程中,选择 Python。
- 从 Cygwin 终端,照常安装virtualenv 。
为 supervisord 创建一个 virtualenv,然后照常安装:
pip install supervisord
以通常的方式配置supervisord。请记住,supervisord 将与 Cygwin 一起运行,因此您最好使用 Cygwin 方式的路径(C:\myservers\project1 在 Cygwin 中转换为 /cygdrive/c/myservers/project1)。
现在您可能希望将 supervisord 安装为服务。这是我的做法:
cygrunsrv --install supervisord --path /home/Administrator/supervisor/venv/bin/python --args "/home/Administrator/supervisor/venv/bin/supervisord -n -c /home/Administrator/supervisor/supervisord.conf"
转到 Windows 服务管理器并启动刚刚安装的服务 supervisord。
第 5 点将 supervisord 安装为 Windows 服务,以便您可以从 Windows 服务管理器控制它(启动/停止/重新启动)。但是你可以做的事情supervisorctl
照常工作,这意味着你可以简单地部署你的旧配置文件。
您可能希望将脚本作为Windows Service
. 为此,您需要python-win32库。这个问题很好地描述了你如何做这件事,以及一堆其他相关资源的链接。这个问题也可能有用。
AWindows Service
是您希望如何包装任何需要在 Windows 上连续运行的脚本。它们可以配置为在引导时自动启动并处理故障。没有什么可以阻止任何人杀死进程本身,但要处理这种潜在情况,您只需创建一个bat
文件并使用sc
命令来获取服务以查看它是否正在运行,如果没有则重新启动服务。只需安排bat
文件每 60 秒运行一次(或者任何合理的脚本可能会关闭)。
如果您想要一个在大多数 posix OS 上运行并且像 supervisord 一样基于 Python 的类似 supervisord 的进程管理器,那么您应该查看 honcho,它是 foreman 的 Python 端口(基于 Ruby):
http://pypi.python.org/pypi/honcho/
它在mac、linux上运行良好,但(实际上)还不是windows ...(编辑我最初的答案,我乐观地说它已经在windows上运行,基于一个已被丢弃的拉取请求)
有一个分支在这里提供 Windows 支持https://github.com/redpie/honcho 和一些正在进行的工作以支持 Windows https://github.com/nickstenning/honcho/issues/28 ...至少它在不久的将来可能成为一种可能的解决方案。
这里还有一个支持 Windows 的工头叉:https ://github.com/ddollar/foreman-windows可能对你有用,尽管我从未尝试过。
因此,就目前而言,Windows 服务可能是您最好的短期选择。
windows 的主管在 python27 - 32 位上为我们工作。我必须安装 pypiwin32 和 pywin32==223。
由于这是一个带有旧答案的老问题,我将用最新消息对其进行更新:
有一个supervisor-win项目声称支持Windows 上的supervisor。
不,在 Windows 下不支持 supervisord。
但是您可以做的是,从包装脚本自动重新启动它:
#!/usr/bin/python
from subprocess import Popen
file_path = " script_to_be_restarted.py"
args_as_str = " --arg1=woop --arg2=woop"
while True:
print("(Re-)Start script %s %s" % (file_path, args_as_str))
p = Popen("python " + file_path + args_as_str, shell=True)
p.wait()