0

非常に単純な BaseHttpServer (以下のコード) を使用すると、次の問題が発生します。

を使用してバックグラウンドでサーバーを起動する./testserver.py &と正常に動作し、サーバーはポート 12121 で応答します。サーバーを入力するとdisown、まだ応答します。ターミナルを閉じた後、サーバーは次のリクエストの後に入出力エラーで停止しますtest.log

再構築の手順:

$ ./testserver &
$ bg
$ disown

ターミナルを閉じて、サーバーにリクエストを送信します -> サーバーが応答しません。

stdout私が見つけた唯一の解決策は、 andをリダイレクトすることでしたstderr: $ ./testserver > /dev/null 2>&1 または @Daniel Stated で通常の方法で呼び出すように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))
4

1 に答える 1

2

例外ではなく、ファイルに文字列のみを書き込むことができます。stdoutそして、どこかにリダイレクトする必要がありstderrます。そうしないと、出力によってプログラムがハングします。なぜあなたは使わないのですnohupか?これは、ターミナルなしでプログラムを開始する通常の方法です。

これを明確にするために: HttpServer には特別な動作はありません。HttpServer はログ情報を端末に書き込んでいるため、端末またはファイルへのリダイレクトが必要です。

于 2014-04-24T08:44:15.207 に答える