【发布时间】:2011-11-29 14:20:54
【问题描述】:
我需要运行 python 脚本并确保它在终止后会重新启动。我知道有一个名为 supervisord 的 UNIX 解决方案。但不幸的是,我的脚本必须运行的服务器在 Windows 上。你知道什么工具有用吗? 谢谢
【问题讨论】:
标签: python windows supervisord
我需要运行 python 脚本并确保它在终止后会重新启动。我知道有一个名为 supervisord 的 UNIX 解决方案。但不幸的是,我的脚本必须运行的服务器在 Windows 上。你知道什么工具有用吗? 谢谢
【问题讨论】:
标签: python windows supervisord
您可能希望以Windows Service 的身份运行您的脚本。为此,您需要 python-win32 库。这个question 很好地描述了你是如何做到这一点的,以及一堆其他相关资源的链接。这个question 也可能有用。
Windows Service 是您想要包装任何需要在 Windows 上连续运行的脚本的方式。它们可以配置为在引导时自动启动并处理故障。没有什么能阻止任何人杀死进程本身,但要处理这种潜在情况,您只需创建一个bat 文件并使用sc 命令来获取服务以查看它是否正在运行,如果没有重新启动服务。只需安排 bat 文件每 60 秒运行一次(或任何合理的脚本可能会关闭)。
【讨论】:
如果您想要一个在大多数 posix 操作系统上运行并且像 supervisord 一样基于 Python 的类似 supervisord 的进程管理器,那么您应该查看 honcho,它是 foreman(基于 Ruby)的 Python 端口:
http://pypi.python.org/pypi/honcho/
它在 mac、linux 上运行良好,但(实际上)还不是 windows...(编辑我最初的答案,我乐观地说它已经在 windows 上运行,基于从那时起被丢弃的拉取请求)
这里有一个 fork 提供 Windows 支持 https://github.com/redpie/honcho 还有一些工作正在进行中以支持 Windows https://github.com/nickstenning/honcho/issues/28 ... 至少它可能在不久的将来成为一个可能的解决方案。
这里还有一个支持 Windows 的工头分支:https://github.com/ddollar/foreman-windows,它可能对你有用,虽然我从未尝试过。
因此,就目前而言,Windows 服务可能是您最好的短期选择。
【讨论】:
kill 一个时它不会。那么我们必须使用 supervisor 和 honcho 的组合吗?谢谢。
尽管有很大的免责声明here,您可以在Windows 中使用Cygwin 运行Supervisor;事实证明,Cygwin 在模拟 Posix 环境方面走了很长一段路,效果非常好,以至于实际上 supervisord 运行不变。无需学习新工具,如果您需要跨多个平台部署复杂的项目,您甚至可以节省大量工作。
这是我的食谱:
为 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 服务管理器并启动您刚刚安装的服务主管。
第 5 点将 supervisord 安装为 Windows 服务,以便您可以从 Windows 服务管理器控制它(启动/停止/重新启动)。但是你可以用supervisorctl 做的事情照常工作,这意味着你可以简单地部署你的旧配置文件。
【讨论】:
pip install supervisor,它需要python 2.4+,但它不适用于任何3+版本。
supervisor for windows 在 python27 - 32 位上为我们工作。我必须安装 pypiwin32 和 pywin32==223。
【讨论】:
不,在 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()
【讨论】:
由于这是一个带有旧答案的老问题,我将用最新消息对其进行更新:
有一个supervisor-win 项目声称支持Windows 上的supervisor。
【讨论】: