Ich arbeite an einem Daemon, wo ich einen HTTP-Server einbetten muss. Ich versuche es mit BaseHTTPServer, wenn ich es im Vordergrund ausführe, funktioniert es gut, aber wenn ich versuche, den Daemon in den Hintergrund zu verzweigen, hört er auf zu arbeiten. Meine Hauptanwendung funktioniert weiterhin, aber BaseHTTPServer nicht.Daemonizing Python's BaseHTTPServer
Ich glaube, das hat etwas damit zu tun, dass BaseHTTPServer Protokolldaten an STDOUT und STDERR sendet. Ich leite diese zu Dateien um. Hier ist der Code-Schnipsel:
# 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()
Bin ich etwas zu tun, ist hier falsch oder BaseHTTPServer irgendwie verhindert daemonisierte immer?
Edit: Aktualisierter Code, um den zusätzlichen, bisher fehlenden Codefluss zu demonstrieren, und dass log.debug in meinem gegabelten Hintergrunddämon zeigt, dass ich Code nach fork triff.
Warum genau ist es SCHLECHT? Bitte, dies ist eines der Top-Ergebnisse in Google ... Es gibt eine riesige Menge von vorgefertigten Python-Bibliothek für http, so dass mehr eine Beschreibung dieser wäre auch erstaunlich. – nsij22