【问题标题】:How do I keep a python HTTP Server up forever?如何永远保持 python HTTP 服务器正常运行?
【发布时间】:2011-09-09 15:24:37
【问题描述】:

我在 python 中编写了一个简单的 HTTP 服务器,以通过 Web UI 管理托管在服务器上的数据库。它功能完善,可以按预期工作。但是它有一个巨大的问题,它不会保持不变。它可以工作一个小时左右,但是如果在返回使用它时长时间不使用,我每次都必须重新初始化它。现在我用来让它服务的方法是:

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 & 的命令来分离它,但正如我之前提到的,它会在一段时间后退出。任何建议都值得赞赏,因为我不明白它为什么会关闭。

【问题讨论】:

  • “一段时间后它退出”。你真的需要解决这个问题。在你弄清楚它“退出”什么之后,其他一切都很容易。请更准确地定义“退出”。请更新问题,说明退出的正确原因。

标签: python http shutdown


【解决方案1】:

您可以使用python-daemon 包在Python 中编写UNIX daemon,或使用pywin32 编写Windows service

不幸的是,我不知道编写守护程序/服务进程的“可移植”解决方案(用 Python 或其他方式)。

【讨论】:

    【解决方案2】:

    这是一个关于驾驶的故事中的一条建议。你当然想安全驾驶(找出你的程序失败的原因并修复它)。在(罕见?)崩溃的情况下,一些监控基础设施,如monit,可以帮助重启崩溃的进程。您可能不想用它来掩盖车祸,就像您不想每次停车时都打开安全气囊一样。

    【讨论】:

      【解决方案3】:

      嗯,第一步是找出它崩溃的原因。有两种可能:

      • serve_forever 调用引发异常。
      • python 进程正在崩溃/被终止。

      在前一种情况下,您可以通过将其包装在一个循环中并使用 try-except 来使其永远存在。记录错误详细信息可能是个好主意。

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

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

      【讨论】:

        【解决方案4】:

        您是否尝试过在 screen 会话中运行它?

        $ screen -L sudo python webserver.py
        

        【讨论】:

          【解决方案5】:

          作为屏幕的替代品,NoHup 将确保进程在您注销后继续运行。

          值得检查日志以了解其终止/退出的原因以及它可能与操作系统无关,而是内部故障。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-26
            • 2014-12-02
            • 2023-03-27
            相关资源
            最近更新 更多