CGIHTTPServer mit eigenem CGI beenden/neustarten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich habe es schon mal hier http://python.sandtner.org/viewtopic.php?t=2741 nachgefragt, aber noch keine funktionierende Lösung gefunden...

Ich möchte den CGIHTTPServer mit einem CGI-Skript, welches von ihm selber Ausgeführt wird, beenden bzw. neustarten...

Nun hab ich gesehen, das serve_forever() einfach nur eine endlos-while-Schleife ist, die immer self.handle_request() aufruft... Ich denke hier könnte man ansetzten und ein bedingter abbruch der Schleife einbauen...
Nun suche ich nach einer Möglichkeit dem Server auch zu sagen, "nun beende dich mal" Eine Methode, die BlackJack in den o.g. Thread eingeworfen hat, wäre einfach eine bestimmte URL abzurufen wie "\kill.me"... Das könnte man in RequestHandler().is_cgi() abfragen... Aber ich brauche die Informationen in der CGIHTTPServer Klasse. Da weiß ich nicht, wie ich ran kommen kann...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Eine schnelle, aber doofe Lösung wäre es die spezielle URL in RequestHandler().is_cgi() anzufragen und mit os.kill() den eigenen Prozess abzuschiessen... Nur wie finde ich die PID des eigenen Skriptes raus?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dank eines Tipps aus der news-Group, hab ich nun eine Möglichkeit gefunden...

Beispiel für ein ServerShutdown - CGI:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-

print "Content-Type: text/html\n\n"

print "<h2>Server wird beender</h2>"

raise KeyboardInterrupt, "Server wird beendet"
Hier die Modifizierte Server-Klasse:

Code: Alles auswählen

class MyThreadingServer( SocketServer.ThreadingTCPServer ):

    allow_reuse_address = 1    # Seems to make sense in testing environment

    def __init__(self, server_address, request_handler, AllowIPs):
        SocketServer.ThreadingTCPServer.__init__(self, server_address, request_handler)
        self.ServerLoop = True

    def serve_forever(self):
        """Handle Request loop solange self.ServerLoop==True ist"""
        while self.ServerLoop:
            self.handle_request()

    def handle_error(self, request, client_address):
        """Handle an error gracefully.

        The default is to print a traceback and continue.

        """
        print '-'*40

        import exceptions
        if sys.exc_type == exceptions.KeyboardInterrupt:
            print "Server wird beendet!"
            self.ServerLoop = False
            return

        # Normale Fehlerausgabe
        print 'Exception happened during processing of request from',
        print client_address
        import traceback
        traceback.print_exc() # XXX But this goes to stderr!
        print '-'*40
Das ganze funktioniert über die Variable self.ServerLoop Diese wird in __init__ auf True gesetzt, wodurch eine Endlos-Scheife in serve_forever() funktioniert, bis ein KeyboardInterrupt von einem CGI-File ausgelöst wird...

Verbesserungs Vorschläge erwünscht!
Antworten