Seite 2 von 2

Verfasst: Dienstag 4. Dezember 2007, 09:02
von gerold
droptix hat geschrieben:gibt es Scripts, um ein Python-Programm als Dienst zu installieren - wobei das Script selbst entscheidet unter welchem Betriebssystem welche Maßnahmen zu treffen sind? Also unter Unix über init-Script und unter Windows über die pywin32-Extensions?
Hallo droptix!

Eher nicht. Denn unter Windows ist das sehr viele Schwieriger als unter Linux. Unter Linux reagierst du auf die zwei/drei Signale, kümmerst dich darum, dass beim Starten ein PID-File angelegt wird, beim Beenden das PID-File wieder gelöscht wird und legst ein Init-Skript an. Fertig!

Unter Windows ist das schon ein wenig komplizierter und meine persönliche Erfahrung damit ist, dass ein Dienst unter Windows sehr viel schwerer zu debuggen ist. Es kahm schon vor, dass ich Tage brauchte um einen Dienst für Windows so zu programmieren, dass dieser auch anstandslos auch unter den 40 verschiedenen Windows-Clients eines Kunden lief und sich auch schön mit Bordmitteln beenden und neu starten lies.

Zumindest bekommst du mit ``sys.platform`` raus auf welchem Betriebssystem dein Programm läuft. Dann kannst du dich selber um die Trennung kümmern.

mfg
Gerold
:-)

pidfile und WinSrv

Verfasst: Dienstag 4. Dezember 2007, 12:25
von droptix
gerold hat geschrieben:Unter Linux reagierst du auf die zwei/drei Signale, kümmerst dich darum, dass beim Starten ein PID-File angelegt wird, beim Beenden das PID-File wieder gelöscht wird und legst ein Init-Skript an. Fertig!
Wer legt eigentlich das PID-File an -> mein Programm oder das Init-Script? Was steht da drin, ich nehme an einfach nur die Prozess-Id? Wo muss das PID-File liegen?
gerold hat geschrieben:Unter Windows ist das schon ein wenig komplizierter und meine persönliche Erfahrung damit ist, dass ein Dienst unter Windows sehr viel schwerer zu debuggen ist. Es kahm schon vor, dass ich Tage brauchte um einen Dienst für Windows so zu programmieren, dass dieser auch anstandslos auch unter den 40 verschiedenen Windows-Clients eines Kunden lief und sich auch schön mit Bordmitteln beenden und neu starten lies.
Stell ich mir nun wieder nicht so kompliziert vor... klar man weiß eigentlich gar nicht was Windows da macht, aber mit dem Tool "anysrv.exe" aus dem Windows Resource Kit hab ich meine Python-Scripts als Dienst zum Laufen bekommen, die sich dann auch regulär starten und beenden lassen.

Nun ist das nicht gerade elegant, daher finde ich die pywin32-Geschichte sauberer und besser. Dort möchte ich mich reinfitzen...
gerold hat geschrieben:Zumindest bekommst du mit ``sys.platform`` raus auf welchem Betriebssystem dein Programm läuft.
Klaro, nur bevor ich da jetzt los lege wollte ich mal nachfragen, ob das nicht schon zufällig jemand vor mir realisiert hat.

Re: pidfile und WinSrv

Verfasst: Dienstag 4. Dezember 2007, 12:47
von gerold
Hallo droptix!
droptix hat geschrieben:Wer legt eigentlich das PID-File an -> mein Programm oder das Init-Script? Was steht da drin, ich nehme an einfach nur die Prozess-Id? Wo muss das PID-File liegen?
Du musst das PID-File selber anlegen. Normalerweise in den Ordner */var/run/*. Drinnen sollte die Prozess-ID stehen.
droptix hat geschrieben:Nun ist das nicht gerade elegant, daher finde ich die pywin32-Geschichte sauberer und besser. Dort möchte ich mich reinfitzen...
http://www.python-forum.de/topic-8422.html hast du sicher schon gelesen. Schwierig wird es erst bei größeren Programmen, die andere Module importieren sollen. Um Pfade und die kompletten Umgebungsvariablen musst du dich selber kümmern.

mfg
Gerold
:-)

Re: pidfile und WinSrv

Verfasst: Dienstag 4. Dezember 2007, 14:28
von Leonidas
droptix hat geschrieben:Wer legt eigentlich das PID-File an -> mein Programm oder das Init-Script? Was steht da drin, ich nehme an einfach nur die Prozess-Id? Wo muss das PID-File liegen?
Theoretisch egal. DU kannst auch das Init-Skript und das Programm selbst zusammenlegen. Hat ja niemand behauptet, dass Init-Skripte in der `sh`-Sprache sein müssen. Praktisch hast du allerdings das Problem, wenn du im Init-Skript das PID-File anlegst dass das Programm sofort danach sterben kann (ImportError oder so), du also ein PID-File hast, dessen Prozess tot ist.

FHS dazu.

Re: pidfile und WinSrv

Verfasst: Freitag 7. Dezember 2007, 19:14
von droptix
Leonidas hat geschrieben:Praktisch hast du allerdings das Problem, wenn du im Init-Skript das PID-File anlegst dass das Programm sofort danach sterben kann (ImportError oder so), du also ein PID-File hast, dessen Prozess tot ist.
Das passiert doch aber auch, wenn das Programm das PID-File anlegt und danach stirbt... es räumt ja keiner auf, richtig? Daher ist mir noch nicht klar, wie sich das vermeiden ließe...

Re: pidfile und WinSrv

Verfasst: Freitag 7. Dezember 2007, 19:19
von BlackVivi
droptix hat geschrieben:
Leonidas hat geschrieben:Praktisch hast du allerdings das Problem, wenn du im Init-Skript das PID-File anlegst dass das Programm sofort danach sterben kann (ImportError oder so), du also ein PID-File hast, dessen Prozess tot ist.
Das passiert doch aber auch, wenn das Programm das PID-File anlegt und danach stirbt... es räumt ja keiner auf, richtig? Daher ist mir noch nicht klar, wie sich das vermeiden ließe...
Die Bashscripts fangen das dann ja auf und löschen den PID File, sollten sie zumindest.

Verfasst: Freitag 7. Dezember 2007, 20:29
von Leonidas
Im Python hast du das Problem eigentlich gar nicht weil du mit `atexit` Funktionen definieren kannst die dann am Schluss aufräumen. Außer dein Programm crasht den Interpreter, aber das bekommst du eigentlich nur mit kaputten C-Modulen hin, ansonsten ist der Interpreter ziemlich robust.