Python Programm aus Python Skript als neuen Prozess starten

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
Kreavis
User
Beiträge: 11
Registriert: Dienstag 11. August 2009, 11:15

Donnerstag 26. Juli 2012, 11:36

Hallo liebe Python Gemeinde,

ich habe für meine Zwecke einen kleinen Watchdog geschrieben. Dieser läuft in einer Endlosschleife und prüft regelmäßig ob ein Logfile noch beschrieben wird oder nicht.

Falls die Logdatei älter als ein definiertes Intervall ist, so wird die zugehörige ProzessID gesucht um das Programm zu killen und erneut zu starten. Die ProzessID existiert noch, da der Server manchmal klemmt und stehen bleibt.

Die ProzessID ermittle ich mit einem Linux Befehl:

Code: Alles auswählen

command = "ps -aef | grep /../../server.py |grep -v grep |awk '{print $2}' | xargs"
p = sub.Popen([command], shell=True, stdout=sub.PIPE,stderr=sub.PIPE)
pid = p.communicate()
Anschließend wird der Server mit os.kill gestoppt.

Bis hierher ist alles gut, aber:

Jetzt soll der Server aus diesem watchdog Skript heraus neu gestartet werden. Ich bekomme den Server aber nicht gestartet, ohne dass die Ausgaben des Servers dann in meinem Watchdog erscheinen. Welches Modul wird benötigt um das zu bewerkstelligen?

Bin für Hinweise dankbar.

Grüße Kreavis
Zuletzt geändert von Anonymous am Donnerstag 26. Juli 2012, 13:00, insgesamt 2-mal geändert.
Grund: Code-Tags hinzugefügt
deets

Donnerstag 26. Juli 2012, 12:50

Natuerlich auch subprocess. Du musst wahlweise die Ausgaben umleiten in eigene Dateien, nach /dev/null, oder es gleich richtig machen + das daemonize-Paket verwenden, um deinen Server proper zu daemonisieren und damit auch die stdin/stdout/strerr-Stroeme korrekt zu behandeln.
lunar

Donnerstag 26. Juli 2012, 13:01

@Kreavis: Verwende das "psutil"-Modul, um den Prozess zu suchen, oder zumindest "pgrep -f server.py". Dieses Shell-Kommando ist ja fürchterlich…
Kreavis
User
Beiträge: 11
Registriert: Dienstag 11. August 2009, 11:15

Donnerstag 26. Juli 2012, 13:07

deets hat geschrieben:Natuerlich auch subprocess. Du musst wahlweise die Ausgaben umleiten in eigene Dateien, nach /dev/null, oder es gleich richtig machen + das daemonize-Paket verwenden, um deinen Server proper zu daemonisieren und damit auch die stdin/stdout/strerr-Stroeme korrekt zu behandeln.

Ok, dann versuche ich es mal damit. Muss noch testen wie ich die Umleitungen subprocess beibringe. Vielen Dank für den Hinweis, dann weis ich schonmal wo ich suchen muss.
Kreavis
User
Beiträge: 11
Registriert: Dienstag 11. August 2009, 11:15

Donnerstag 26. Juli 2012, 13:22

lunar hat geschrieben:@Kreavis: Verwende das "psutil"-Modul, um den Prozess zu suchen, oder zumindest "pgrep -f server.py". Dieses Shell-Kommando ist ja fürchterlich…
Oh, das ist wunderbar. Danke für den Hinweis. Den Befehl kannte ich nicht.
Es gibt sogar ne Wikiseite, da steht genau der Befehl und mein alter Befehl...
http://de.wikipedia.org/wiki/Pgrep
deets

Donnerstag 26. Juli 2012, 13:49

Wie gesagt, wenn du daemonize in deinem server-prozess verwendest, dann macht das das schon fuer dich.
Antworten