Seite 1 von 1

start und shutdown in demselben programm

Verfasst: Dienstag 14. Februar 2006, 14:05
von Mad-Marty
Hallo,

und noch eine frage meinerseits, wie schaffe ich es, das ein programm
wenn es ohne parameter aufgerufen wird startet, und wenn mit -stop es sich beendet ?


Ich weiss das ich es mit getopt machen können und die pid das anderen processes killen könnte.

Aber killen ist meiner meinung nach keine gute idee, am liebsten würde ich in dem laufenden programm die interne variable z.b. Shutdown auf True setzen.
Die wird dann regelmässig geprüft und beendet alles ordentlich.

Nur wie könnte man sowas unter Linux und Windows erreichen ?

Verfasst: Dienstag 14. Februar 2006, 14:26
von Rebecca
Mmh, wie waer's mit Signalen?

Wenn man das Programm ohne Parameter aufruft, startet es einen Prozess, speichert die ID in einer Datei und beendet sich.

Wenn man das Programm mit -stop aufruft, sendet es ein Signal an den
Prozess, dessen Prozess-ID gespeichert wurde. Dieser Prozess muss dann einen entrpechenden Signal-Handler haben, der dann fuers Aufraeumen und beenden sorgt.

Ich kenne mich mit Signalen in Python nicht aus, es gibt jedoch ein Modul namens signal...

Verfasst: Mittwoch 15. Februar 2006, 14:03
von Mad-Marty
Danke, das glaube ich klappt.

Die pid hole ich mir mit os.getpid und schreibe ein pidfile,
nur weiss ich keinen rat wie ich jetzt ein signal an den process schicken kann.

Ich möchte SIGTERM nehmen als signal und habe dafür einen handler installiert.

Das ganze sollte aber auch unter windows funktionieren.


Weiss jemand rat ?

Danke schonmal.

Verfasst: Mittwoch 15. Februar 2006, 15:22
von mr.hide
Kommt darauf an wie professionell es werden soll.

Laienhaft kannst auch true oder false in das file schreiben. :wink:
Und dies anstatt der variablen überprüfen.

Das ist aber nur ne "Pfuscherlösung"

Verfasst: Mittwoch 15. Februar 2006, 15:35
von Rebecca
Unter Linux/Unix sendet man Signale via os.kill(pid, signal).

Soweit ich das jetzt richtig sehe, scheint es in Windows generell nicht moeglich zu sein, etwas analoges zu Signalen von Prozess zu Prozess zu senden. (Egal ob mit Python oder was auch immer). Es gibt lediglich Events zwischen Threads. :roll:

@mr.hide: Du meinst, das laufende Programm ueberprueft hin und wieder, ob in einer bestimmten Datei True oder False drinsteht und macht dann entweder weiter oder beendet sich? Das sollte jedenfall auch unter Windows gehen :wink:

Verfasst: Mittwoch 15. Februar 2006, 15:49
von Mad-Marty
hmmmm naja ...

also das erscheint mir nicht besonders schön, würde ich aber zur not so machen.

Wie sieht es dann aus eine beenden anforderung unter windows zu senden, ähnlich SIGTERM, und diese zu handeln ?

Irgendwie muss windows doch auch seinen programmen sagen "hey, beende dich, der user mag dich nicht mehr!".

;-)

Verfasst: Mittwoch 15. Februar 2006, 16:44
von Rebecca
Naja, der normale Weg ist es ja, dass der User das Programm aus dem Programm heraus beendet (Button klickt oder so) und sich dann das Programm von sich aus beendet.

Etwas ganz anderes ist es, wenn ein externer Prozess einen anderen Prozess zum Beenden bringen soll. Das waere das, was z.B. der TaskManager macht, wenn man auf Task beenden klickt. Keine Ahnung, wie das realisiert ist.

Hab uebrigens gerade was interessantes gefunden:
Linux to Windows Migration

Verfasst: Mittwoch 15. Februar 2006, 18:39
von Mad-Marty
Ok, jetzt weiss ich immerhin schon, das ich sowas von win32 extensions brauch wie WMI mit WM_CLOSE messages.


Habe allerdings immernoch keine Ahnung wo ich genau anfangen muss.


Vielleicht schreibt ja noch jemand der mehr von den Windows Messages weiss. *hoff*

Verfasst: Donnerstag 16. Februar 2006, 11:56
von Mad-Marty
Habe eine Lösung gefunden.
Vielleicht hilft das ja noch jemand anderem ... :

Da man das WM (windows messaging) modell verwendet braucht man die win32 extensions.

Man kreiert dann mit

Code: Alles auswählen

self.event = win32event.CreateEvent (None, manual_reset, initial_state, eventname)
einen event.

Diesen registriert man mit unendlicher wartezeit / blocking.

Code: Alles auswählen

win32event.WaitForSingleObject (self.event, win32event.INFINITE)
Aus der 2ten instanz schickt man dann diesen event.

Code: Alles auswählen

win32event.PulseEvent (self.event)

Info: Das Windows Event System funktioniert nicht wie das *NIX signal prinzip, alle prozesse haben zugriff auf alle Windows Messages.

Allerdings resettet der erste der ihn entgegennimmt die Message.

Hat man also 5 prozesse die alle auf die gleiche Windows Message warten,
muss man diese auch 5 mal absenden, oder man disable auto_reset,
dann muss man aber die Message selbst stoppen, da sie sonst unbegrenzt bereitsteht. Oder man gibt timeouts an, in msec, wie lange eine Message bereitstehen soll.