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 ?
start und shutdown in demselben programm
- 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...
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...
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.
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.
Kommt darauf an wie professionell es werden soll.
Laienhaft kannst auch true oder false in das file schreiben.
Und dies anstatt der variablen überprüfen.
Das ist aber nur ne "Pfuscherlösung"
Laienhaft kannst auch true oder false in das file schreiben.

Und dies anstatt der variablen überprüfen.
Das ist aber nur ne "Pfuscherlösung"
Grüße
Matthias
- Fluchen befreit von Kummer und Leid -
Matthias
- Fluchen befreit von Kummer und Leid -
- 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.
@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
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.

@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

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

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

- 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
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
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*
Habe allerdings immernoch keine Ahnung wo ich genau anfangen muss.
Vielleicht schreibt ja noch jemand der mehr von den Windows Messages weiss. *hoff*
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
einen event.
Diesen registriert man mit unendlicher wartezeit / blocking.
Aus der 2ten instanz schickt man dann diesen 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.
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)
Diesen registriert man mit unendlicher wartezeit / blocking.
Code: Alles auswählen
win32event.WaitForSingleObject (self.event, win32event.INFINITE)
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.