首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >守护python的BaseHTTPServer

守护python的BaseHTTPServer
EN

Stack Overflow用户
提问于 2009-05-20 16:04:22
回答 6查看 17.2K关注 0票数 12

我在一个守护进程上工作,我需要在其中嵌入HTTP服务器。我正在尝试使用BaseHTTPServer,当我在前台运行它时,它工作得很好,但当我尝试将守护进程派生到后台时,它停止工作。我的主应用程序可以继续工作,但BaseHTTPServer不能。

我相信这与BaseHTTPServer将日志数据发送到STDOUT和STDERR的事实有关。我正在将它们重定向到文件。以下是代码片段:

代码语言:javascript
复制
# Start the HTTP Server
server = HTTPServer((config['HTTPServer']['listen'],config['HTTPServer']['port']),HTTPHandler)

# Fork our process to detach if not told to stay in foreground
if options.foreground is False:
    try:
        pid = os.fork()
        if pid > 0:
            logging.info('Parent process ending.')
            sys.exit(0)            
    except OSError, e:
        sys.stderr.write("Could not fork: %d (%s)\n" % (e.errno, e.strerror))
        sys.exit(1)

    # Second fork to put into daemon mode
    try: 
        pid = os.fork() 
        if pid > 0:
            # exit from second parent, print eventual PID before
            print 'Daemon has started - PID # %d.' % pid
            logging.info('Child forked as PID # %d' % pid)
            sys.exit(0) 
    except OSError, e: 
        sys.stderr.write("Could not fork: %d (%s)\n" % (e.errno, e.strerror))
        sys.exit(1)


    logging.debug('After child fork')

    # Detach from parent environment
    os.chdir('/') 
    os.setsid()
    os.umask(0) 

    # Close stdin       
    sys.stdin.close()

    # Redirect stdout, stderr
    sys.stdout = open('http_access.log', 'w')
    sys.stderr = open('http_errors.log', 'w')    

# Main Thread Object for Stats
threads = []

logging.debug('Kicking off threads')

while ...
  lots of code here
...

server.serve_forever()

这里是我做错了什么,还是BaseHTTPServer被阻止成为守护进程?

编辑:更新了代码,以演示额外的、以前缺少的代码流,以及log.debug在我的派生后台守护进程中显示的我一次又一次地点击代码。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-20 21:17:13

在用谷歌搜索了一下之后,我用finally stumbled over this BaseHTTPServer documentation搜索了一下,结果是:

代码语言:javascript
复制
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
  """Handle requests in a separate thread."""

server = ThreadedHTTPServer((config['HTTPServer']['listen'],config['HTTPServer']['port']), HTTPHandler)
server.serve_forever()

这在很大程度上是在我分叉并最终解决我的问题之后发生的。

票数 8
EN

Stack Overflow用户

发布于 2010-02-12 07:13:10

下面是如何使用python-daemon库完成此操作:

代码语言:javascript
复制
from BaseHTTPServer import (HTTPServer, BaseHTTPRequestHandler)
import contextlib

import daemon

from my_app_config import config

# Make the HTTP Server instance.
server = HTTPServer(
    (config['HTTPServer']['listen'], config['HTTPServer']['port']),
    BaseHTTPRequestHandler)

# Make the context manager for becoming a daemon process.
daemon_context = daemon.DaemonContext()
daemon_context.files_preserve = [server.fileno()]

# Become a daemon process.
with daemon_context:
    server.serve_forever()

与通常的守护进程一样,您需要决定在程序成为守护进程后如何与其交互。例如,您可能注册了一个systemd服务,或者编写了一个PID文件,等等。这些都超出了问题的范围。

特别是,这超出了问题的范围:一旦它成为一个守护进程(必须与任何控制终端分离),how do I stop the daemon process?这取决于你的决定,作为定义程序行为的一部分。

票数 4
EN

Stack Overflow用户

发布于 2009-05-20 17:06:00

首先实例化一个HTTPServer。但是您实际上并没有告诉它在所提供的任何代码中开始服务。在您的子进程中,尝试调用server.serve_forever()

供参考的See this

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/888834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档