是否有Windows模拟监督?

时间:2011-10-02 23:02:47

标签: python windows supervisord

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

6 个答案:

答案 0 :(得分:37)

尽管有大量免责声明here,您可以在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服务管理器并启动刚安装的服务管理。

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:5)

如果你想要一个类似于supervisord的流程管理器,它运行在大多数posix操作系统上并且基于Python,就像supervisord那样,那么你应该看看作为工头的Python端口的honcho(基于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服务可能是您最好的短期选择。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

否,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()