28

我需要运行 python 脚本并确保它在终止后会重新启动。我知道有一个名为 supervisord 的 UNIX 解决方案。但不幸的是,我的脚本必须运行的服务器在 Windows 上。你知道什么工具有用吗?谢谢

4

6 回答 6

41

尽管这里有很大的免责声明,但您可以在 Windows 中使用Cygwin运行 Supervisor ;事实证明,Cygwin 在模拟 Posix 环境方面走了很长一段路,效果非常好,以至于实际上 supervisord 运行不变。无需学习新工具,如果您需要跨多个平台部署复杂的项目,您甚至可以节省大量工作。

这是我的食谱:

  1. 如果您还没有这样做,请安装 Cygwin。在安装过程中,选择 Python。
  2. 从 Cygwin 终端,照常安装virtualenv 。
  3. 为 supervisord 创建一个 virtualenv,然后照常安装:

    pip install supervisord
    
  4. 以通常的方式配置supervisord。请记住,supervisord 将与 Cygwin 一起运行,因此您最好使用 Cygwin 方式的路径(C:\myservers\project1 在 Cygwin 中转换为 /cygdrive/c/myservers/project1)。

  5. 现在您可能希望将 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"
    
  6. 转到 Windows 服务管理器并启动刚刚安装的服务 supervisord。

第 5 点将 supervisord 安装为 Windows 服务,以便您可以从 Windows 服务管理器控制它(启动/停止/重新启动)。但是你可以做的事情supervisorctl照常工作,这意味着你可以简单地部署你的旧配置文件。

于 2013-08-03T11:25:55.207 回答
11

您可能希望将脚本作为Windows Service. 为此,您需要python-win32库。这个问题很好地描述了你如何做这件事,以及一堆其他相关资源的链接。这个问题也可能有用。

AWindows Service是您希望如何包装任何需要在 Windows 上连续运行的脚本。它们可以配置为在引导时自动启动并处理故障。没有什么可以阻止任何人杀死进程本身,但要处理这种潜在情况,您只需创建一个bat文件并使用sc命令来获取服务以查看它是否正在运行,如果没有则重新启动服务。只需安排bat文件每 60 秒运行一次(或者任何合理的脚本可能会关闭)。

于 2011-10-03T00:37:56.953 回答
6

如果您想要一个在大多数 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 服务可能是您最好的短期选择。

于 2013-02-09T10:50:54.413 回答
3

windows 的主管在 python27 - 32 位上为我们工作。我必须安装 pypiwin32 和 pywin32==223。

于 2018-09-29T21:29:47.253 回答
1

由于这是一个带有旧答案的老问题,我将用最新消息对其进行更新:

有一个supervisor-win项目声称支持Windows 上的supervisor。

于 2020-08-06T08:26:49.567 回答
-1

不,在 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()
于 2019-09-15T15:56:34.890 回答