我正在一个需要嵌入HTTP服务器的守护进程中工作。我正在尝试使用BaseHTTPServer进行操作,当我在前台运行它时,它可以正常工作,但是当我尝试将该守护程序派生到后台时,它将停止工作。我的主应用程序继续工作,但BaseHTTPServer无效。
我认为这与BaseHTTPServer将日志数据发送到STDOUT和STDERR有关。我将那些重定向到文件。这是代码片段:
# 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在派生的后台后台守护程序中显示,我在fork后点击代码。
最佳答案
经过一番谷歌搜索后,我finally stumbled over this BaseHTTPServer documentation,然后我得到了:
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()
在很大程度上,这是在我 fork 并最终解决了我的问题之后。