start und shutdown in demselben programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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 ?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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...
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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.
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

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"
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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:
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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!".

;-)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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*
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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.
Antworten