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.

InformationsquelleAutor Gavin M. Roy | 2009-05-20
Schreibe einen Kommentar