2014-04-24 1 views
0

매우 간단한 BaseHttpServer (아래 코드)를 사용하면 다음과 같은 문제가 발생합니다.파이썬 SimpleHttpServer 배경 버그?

./testserver.py &을 사용하여 백그라운드에서 서버를 시작하면 서버가 12121 포트로 응답하고 응답합니다. disown을 입력하면 서버가 계속 응답합니다. 재구성 test.log

단계 입력/출력 오류에 다음 요청 후 서버가 중지 단말을 닫은 후 :

$ ./testserver & 
$ bg 
$ disown 

가까운 단말 서버에 요청을 전송 -> 서버는 응답하지 않는다.

내가 찾은 유일한 해결책은 리디렉션했다 stdoutstderr : $ ./testserver>을/dev/null 2> 또는 @Daniel는 nohup

가 가지고와 그것을 일반적인 방법으로 전화를 언급 한 바와 같이 누구나 전에이 버그를 경험했거나 출력이 없으면 HttpServer가 작동하지 않는 이유는 무엇입니까?


에만 파일이 아닌 예외 문자열을 쓸 수

#! /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)) 

답변

2

testserver.py. 그리고 stdoutstderr을 다른 곳으로 리디렉션해야합니다. 그렇지 않으면 출력이 프로그램을 중단시킵니다. nohup을 사용하지 않는 이유는 무엇입니까? 터미널없이 프로그램을 시작하는 것이 정상적인 방법입니다.

분명히하려면 : HttpServer에는 특별한 동작이 없습니다. HttpServer는 터미널에 로그 정보를 쓰고 있으므로 터미널이나 파일로의 리디렉션이 필요합니다.

+0

당신은 두 점에 대해 옳았습니다. 그에 따라 코드를 변경했습니다 ('write'는'__str__' 메서드를 사용하지 않습니다.) 그렇다면 실제로'Input/outpu error'가 발생합니다. 가능한 출력이 없으면 HttpServer가 충돌하는 것이 바람직한 동작입니다. – ProfHase85