Daemonizing python BaseHTTPServer
Arbeite ich an einem daemon, wo ich zum einbetten von einem HTTP-server. Ich bin versucht, es zu tun mit BaseHTTPServer, die, wenn ich es in den Vordergrund, es funktioniert gut, aber wenn ich versuchen und Gabel-der daemon in den hintergrund, es Stoppt. Meine Haupt-Anwendung weiter zu arbeiten, aber BaseHTTPServer nicht.
Ich glaube, das hat etwas mit der Tatsache zu tun, dass BaseHTTPServer sendet log Daten an STDOUT und STDERR. Ich bin diese Umleitung in Dateien. Hier ist der Codeausschnitt:
# 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()
Mache ich etwas falsch oder ist BaseHTTPServer irgendwie daran gehindert, immer daemonisierte?
Edit: code Aktualisiert, um zu demonstrieren, das zusätzliche, bisher fehlende code flow und das Protokoll.debug zeigt in meine Gabel, hintergrund-daemon bin ich zu schlagen, code nach der Gabel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach ein bisschen googeln habe ich schließlich stolperte über diese BaseHTTPServer Dokumentation und danach landete ich mit:
Die für die meisten Teil kommt, nachdem ich die Gabel und landete Lösung meines Problems.
Hier ist, wie dies mit der python-daemon Bibliothek:
Wie üblich für ein daemon, müssen Sie entscheiden, wie Sie die Interaktion mit dem Programm nach wird es ein daemon. Sie könnten zum Beispiel registrieren Sie einen systemd-service, oder schreiben Sie eine PID-Datei, etc. Das ist alles außerhalb des Bereichs der obwohl Frage.
Starten Sie durch instanziieren einen HTTPServer. Aber Sie weiß nicht wirklich sagen, es zu starten, die in beliebiger von den bereitgestellten code. In Ihrem Kind-Prozess versuchen Sie anrufen
server.serve_forever()
.Dies sehen Referenz
Einer einfachen Lösung, die für mich gearbeitet wurde das überschreiben der
BaseHTTPRequestHandler
Methodelog_message()
, so dass wir verhindern, dass jede Art von schreiben in stdout und Probleme zu vermeiden, wenn zu verteufeln.Verwenden Sie einfach daemontools oder andere ähnliche Skript, anstatt Ihre eigenen Rollen daemonizing Prozess. Es ist viel besser zu halten, die aus Ihrem Skript.
Auch, die beste option: nicht verwenden, BaseHTTPServer. Es ist wirklich schlecht. Es gibt viele gute HTTP-Server für python, d.h. cherrypy oder einfügen. Beide gehören ready-to-use daemonizing scripts.
Da das angeforderte Antworten, da ich ursprünglich gebucht, ich dachte, dass ich teilen eine kleine info.
Problem mit der Ausgabe zu tun hat mit der Tatsache, dass der Standard-handler für das logging-Modul verwendet die StreamHandler. Der beste Weg, dies zu behandeln ist es, erstellen Sie Ihre eigenen Handler. In dem Fall, wo Sie wollen, verwenden Sie die Standard-logging-Modul, können Sie etwas wie das hier tun:
Auch an diesem Punkt habe ich verschoben, um mit den sehr netten Tornado Projekt für meine embedded-http-Server.