0

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

使用后台启动服务器./testserver.py &工作正常,服务器响应端口 12121 。当我输入disown服务器仍然响应。关闭终端后,服务器在下一个请求后停止,输入/输出错误test.log

重构步骤:

$ ./testserver &
$ bg
$ disown

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

我发现的唯一解决方案是重定向stdoutand stderr: $ ./testserver > /dev/null 2>&1 或 @Daniel 声明以通常的方式调用它nohup

以前有没有人遇到过这个错误,或者如果没有输出可能,为什么这是 HttpServer 崩溃的理想行为?


测试服务器.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))
4

1 回答 1

2

您只能将字符串写入文件而不是异常。你必须重定向stdoutstderr某个地方,否则任何输出都会挂起你的程序。你为什么不使用nohup?这是在没有终端的情况下启动程序的正常方式。

明确一点:HttpServer 中没有特殊行为。HttpServer 正在将日志信息写入终端,因此您需要终端或重定向到文件。

于 2014-04-24T08:44:15.207 回答