【问题标题】:how to deal with Python BaseHTTPServer killed,but the port is still be occupied?如何处理 Python BaseHTTPServer 被杀死,但端口仍然被占用?
【发布时间】:2012-05-23 16:48:17
【问题描述】:

我使用python BaseHTTPServer,它可以处理do_GET,do_POST方法,在do_POST方法中,我使用os.system执行linux shell,当我杀死python脚本时,监听端口仍然被占用,所以我无法运行再次脚本,netstat -antp|grep 80 显示 bash/tail 占用了 80 端口

import sys
import os
import traceback
import time
import logging.handlers
import logging
from threading import *
from datetime import datetime
import urllib2
reload(sys)
sys.setdefaultencoding('utf-8')

class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    server_version = 'python httpserver'
    sys_version = 'b'
    backup_dir = None
    def do_HEAD(s):
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
    def do_GET(self):
        if self.path == '/foo':
            self.send_response(200)               
            os.system('nohup tail -f a.log &')

        else:
            self.send_error(404)
if __name__ == "__main__":
    try:
        server = BaseHTTPServer.HTTPServer(('',80), WebRequestHandler)    
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

【问题讨论】:

    标签: python sockets shell


    【解决方案1】:

    文件描述符默认由子进程继承,因此监听端口 80 的套接字由您使用 system() 调用启动的命令继承。

    为避免这种情况,您应该在侦听套接字上设置 FD_CLOEXEC 标志。这可以通过添加(和使用)特定的 HTTPServer 类来完成。

    class WebServer(BaseHTTPServer.HTTPServer):
        def __init__(self, *args, **kwargs):
            BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
            # Set FD_CLOEXEC flag
            flags = fcntl.fcntl(self.socket.fileno(), fcntl.F_GETFD)
            flags |= fcntl.FD_CLOEXEC
            fcntl.fcntl(self.socket.fileno(), fcntl.F_SETFD, flags)
    

    相关:

    【讨论】:

    • fcntl 未定义,我使用 python2.4
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多