Python SimpleHttpServer后台错误?

0 投票
1 回答
842 浏览
提问于 2025-04-18 04:03

我在使用一个非常简单的BaseHttpServer(下面有代码)时遇到了一个问题:

我用命令 ./testserver.py & 在后台启动服务器,这样没问题,服务器在12121端口上可以正常响应。当我输入 disown 时,服务器依然可以响应。但是,关闭终端后,服务器在下一个请求时就会停止,并在 test.log 中显示输入/输出错误

重现这个问题的步骤:

$ ./testserver &
$ bg
$ disown

关闭终端,向服务器发送请求 -> 服务器没有响应。

我找到的唯一解决办法是将 stdoutstderr 重定向: $ ./testserver > /dev/null 2>&1 或者像@Daniel说的那样,使用 nohup 命令来启动。

有没有人遇到过这个问题?为什么HttpServer在没有输出的情况下会崩溃,这种行为是正常的吗?


testserver.py

#! /usr/bin/env python

import time
import BaseHTTPServer


HOST_NAME = '0.0.0.0'
PORT_NUMBER = 12121


class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_HEAD(s):
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
    def do_GET(s):
        """Respond to a GET request."""
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
        s.wfile.write("MANUAL SERVER SUCCESS")

if __name__ == '__main__':
    server_class = BaseHTTPServer.HTTPServer
    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
    try:
        httpd.serve_forever()
    except Exception as e:
        with open('test.log', 'w') as f:
            f.write(str(e))

1 个回答

2

你只能把字符串写入文件,而不能写入异常信息。而且你必须把 stdoutstderr 重定向到其他地方,否则任何输出都会让你的程序卡住。为什么不试试 nohup 呢?这是一种正常的方式,可以在没有终端的情况下启动程序。

为了让这个更清楚:HttpServer 没有什么特别的行为。HttpServer 会把日志信息写到终端上,所以你需要一个终端或者把信息重定向到一个文件里。

撰写回答