1. September 2005

 

Python und Windows Dienste (Services)

Gleich mal das erste zum Thema Python und Windows Dienste
(Python and Windows Services)
Unsinnigerweise sendet Windows an manche Programme ("Konsolenprogramme") ein Signal (CTRL_LOGOFF_EVENT), wenn sie als Dienst gestartet sind und sich ein Benutzer abmeldet. Welcher Benutzer sich abmeldet, erfährt das Programm aber nicht.
Wer also vorhat, Windows-Dienste mit Python zu entwickeln, aufgepasst!
(Dasselbe gilt übrigens auch für JAVA)
Bestandteil des Tests sollte folgender Testfall sein:
  1. Dienst läuft korrekt.
  2. Benutzer meldet sich an
  3. Benutzer meldet sich wieder ab
  4. Von außen prüfen, ob der Dienst immer noch korrekt läuft.
Falls nicht, liegt wahrscheinlich das oben genannte Problem vor:
Windows sendet ein CTRL_LOGOFF_EVENT.
Python steckt gerade in einem time.sleep oder wait oder was auch immer.
Das Programm (in Multi-Threaded-Programmen nur der Hauptthread!!!) läuft dann auf eine Exception IOError: Interrupted System Call.
Alle Versuche, mit Windows-APIs wie SetConsoleCtrlHandler was zu machen, haben in meinem Fall nicht geholfen.
Tief in den Python-Bibliotheken versteckt (im Quelltext von timemodule.c) sieht man, dass die Implementierung von sleep mit MsgWaitForSingleObject arbeitet und eine Exception schmeißt, wenn dabei kein Timeout auftritt.
Besonders ärgerlich ist es, wenn dann bei Multi-Threading-Programmen der Hauptthread endet, die anderen Threads aber weiter laufen (oder kann man da generell was machen?),
und das Programm dann irgendwie in der Luft hängt.
Lösung/Solution:
Bei allen Vorkommen von time.sleep, evt.wait() etc (im Hauptthread des Programms) mit einem IOError rechnen und diesen abfangen:

try:
time.sleep(1)
except IOError:
log.warn ("Error in sleep - probably caused by CTRL_LOGOFF_EVENT")

This page is powered by Blogger. Isn't yours?