我正在一個守護進程中,我需要嵌入一個HTTP服務器。我試圖用BaseHTTPServer來完成它,當我在前臺運行它時,它可以正常工作,但是當我嘗試將守護進程分叉到後臺時,它停止工作。我的主應用程序繼續工作,但BaseHTTPServer沒有。守護python的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後面的後臺守護進程中。
爲什麼它不好?請,這是谷歌的頂級成果之一......有大量的預建python庫的http,所以更多的描述這些將是驚人的。 – nsij22 2015-05-19 03:33:23