我需要运行python脚本并确保它在终止后重新启动。我知道有一个名为supervisord的UNIX解决方案。但不幸的是,我的脚本必须运行的服务器是在Windows上。你知道什么工具有用吗? 感谢
答案 0 :(得分:37)
尽管有大量免责声明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服务管理器并启动刚安装的服务管理。
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()