如何让Python的HTTP服务器永久运行?

9
我用Python写了一个简单的HTTP服务器,通过Web界面管理托管在服务器上的数据库。它完全可用且按预期工作。然而,它有一个巨大的问题,就是它不会保持运行状态。它可以连续工作一个小时左右,但如果长时间未使用,重新使用时我每次都需要重新初始化它。目前,我使用的方法是:
def main():
    global db
    db = DB("localhost")
    server = HTTPServer(('', 8080), MyHandler)
    print 'started httpserver...'
    server.serve_forever()

if __name__ == '__main__':
    main()

我会在Linux服务器上后台运行它,所以需要运行像sudo python webserver.py &这样的命令来分离它,但是如我之前提到的,过一段时间后它就会停止。欢迎任何建议,因为目前我不知道它为什么会关闭。


6
一会儿后它就停了。你确实需要解决这个问题。在找出它为什么“停止”之后,其他一切都很容易。请更准确地定义“停止”。请用正确的理由更新问题,说明为什么它会“停止”。 - S.Lott
5个回答

4

您可以使用python-daemon包在Python中编写UNIX守护进程,或使用pywin32编写Windows服务

不幸的是,我不知道有没有编写守护进程/服务进程的“便携式”解决方案(无论是使用Python还是其他语言)。


4

以下是与驾驶有关的建议。当然,您希望安全驾驶(找出程序失败的原因并进行修复)。在发生(罕见的?)意外事故时,一些监控基础设施,例如monit,可以帮助重新启动崩溃的进程。您可能不想仅仅为了遮盖崩溃而使用它,就像您不想每次停车时都部署气囊一样。


1

你尝试过在screen会话中运行它吗?

$ screen -L sudo python webserver.py

1
作为 screen 的替代方案,NoHup 可以确保进程在您注销后继续运行。
值得检查日志以查看其被杀死/退出的原因,因为这可能与操作系统无关,而是内部故障。

1

首先,要找出它为什么会崩溃。有两种可能性:

  • serve_forever调用抛出了异常。
  • Python进程崩溃/被终止。

在前一种情况下,您可以通过将其包装在循环中,并使用try-except来使其永久运行。最好记录错误详细信息。

后一种情况有点棘手,因为它可能是由各种原因引起的。如果在前台运行脚本时不会发生这种情况,则可能有某种维护服务正在运行并终止您的脚本?

虽然不是完整的答案,但也许足以帮助您诊断问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接