Seite 1 von 1
CGI - Python script startet langen process an
Verfasst: Donnerstag 27. Januar 2005, 17:10
von nobs
Hallo Leute
Habe ein wenig gesucht aber nix gefunden
Ich will über ein Webinterface einen process auf dem Server anstossen, der länger läuft ( > 2 h)
Das alles läuft mit
Windows NT, Apache (XAMPP), python 2.3.4
Die Idee ist folgendermassen
Also der User klickt auf "Start" ich rufe ein CGI script auf, das eine bat Datei (oder sonst was aufruft, z.B. fürs testen auch "notepad")
der User kriegt dann zB. die Meldung
"Process Gestartet bitte später kontrollieren"
und wenn er nach 3 h nochmal auf die Website schaut steht dort das Ergebniss
Alles geht, nur schaff ich es nicht, das das Script asynchron ausgeführt wird!
Laut Doku sollte spawn das tun ... tut aber nicht
Wenn ich es in python ausführ (also direkt im interpreter ohne Apache) läuft das script solange bis python.exe läuft aber nicht länger !
Mein Code
Code: Alles auswählen
cmd_path=os.environ['SystemRoot']
cmd_path = cmd_path + r"\system32\cmd.exe";
outputdir= 'd:\\U_transfer\\BUILD\\' + user
# starten des scripts
os.spawnl(os.P_NOWAIT ,cmd_path,"/c",r'c:\apachefriends\release_ver\test3.bat ' + label + ' ' + outputdir);
test3.bat ruft z.b. Notepad.exe auf (so zum testen)
das einzige was ansatzweise tut währe
os.startfile('sdfasdfsadf')
aber da kann ich keine parameter übergeben.... (oder gibt es eine möglichkeit

)
Bitte um Hilfe, bin schon am verzweifeln

Re: CGI - Python script startet langen process an
Verfasst: Mittwoch 2. Februar 2005, 18:33
von gerold
nobs hat geschrieben:Ich will über ein Webinterface einen process auf dem Server anstossen, der länger läuft ( > 2 h)
Das alles läuft mit
Windows NT, Apache (XAMPP), python 2.3.4
Alles geht, nur schaff ich es nicht, das das Script asynchron ausgeführt wird! Laut Doku sollte spawn das tun ... tut aber nicht

Hallo nobs!
Ich glaube (bin mir also nicht sicher), dass der
spawn-Prozess beim Beenden des aufrufenden Prozesses gekillt wird.
Vielleicht funktioniert
os.startfile(). Ich habe es aber nicht getestet.
mfg
Gerold

Verfasst: Mittwoch 2. Februar 2005, 18:41
von Leonidas
Ich würde os.system() vorschlagen, das startet Prozesse asyncron. Ist aber nur ein Schuss ins Blaue.
Verfasst: Donnerstag 3. Februar 2005, 10:19
von nobs
os.system() wartet laut Dokumentation auf die Beendigung des calls!
und bei os.startfile() kann man nur eine Datei angeben
ohne übergabeparameter
Habe jetzt aber eine Lösung dafür
Ich erstelle eine Temporäre Bat Datei
in der ich meinen Aufruf reinschreibe (mit Paramter)
und starte diese Datei mit
os.startfile('temp.bat')
ich finds zwar grauslich, aber es funktioniert!
Verfasst: Donnerstag 3. Februar 2005, 14:17
von Leonidas
Du kannst os.system() in einem Thread aufrufen.. nur warscheinlich wird der aufgrufene Prozess gekillt, wenn der Thread endet.
Verfasst: Donnerstag 3. Februar 2005, 14:20
von nobs
das währe ja ziemlich genau das was
os.spawnl(...) macht
Eine möglichkeit währe nun
den process mit os.spawnl aufzurufen und dann den process umhängen
also das er nicht mehr ein childprocess ist, sondern ein childprocess direkt vom OS
habe schon was gefunden dazu,
aber
1. nicht für windows
2. "not for the jelly brain from the street"
d.h. war recht heftiger code (und ich nicht so motiviert mir das genau anzuschauen, da meine primitive Lösung mit der bat datei auch get!
Vielleicht kann mir ja jemand erklären wie man die Childprocesse in windows umhängen kann!
Verfasst: Donnerstag 3. Februar 2005, 15:34
von Leonidas
Wenn du mir den Code, den du gefunden hast mal zeigst, dann kann ich mal gucken.
Verfasst: Donnerstag 3. Februar 2005, 15:47
von jens
Hast du mal versucht, da es unter Windows läuft, mit START zu arbeiten??? mach mal eine cmd auf und tipp mal "start /?" ein... Das müßte eigentlich ein komplett neuen Prozess starten...
Wenn das nicht geht würde ich vorschlagen, schreib eine Art Deamon/Dienst der immer läuft und die Abwicklung für dich erledigt...
Verfasst: Freitag 4. Februar 2005, 10:44
von Gast
Erstmals:
Danke für eure Bemühungen!!!
Ich glaub das mit dem start befehl könnte klappen, das hab ich nämlich schon gesucht (konnte mich dunkel erinnern)
Werde das mahl ausprobieren (habe aber etwas stress deswegen könnte das dauern

)
Werde aber dan das Ergebniss posten!
Verfasst: Donnerstag 10. Februar 2005, 17:00
von nobs
Start befehl geht nicht
Gleiches problem wie vorher !
Die andere Lösung die ich gefunden habe, funktiniert nur unter Unix
da er hier ein fork macht und seine eigene ProcessID mit setgid usw. umsetzt, diese Methoden gibts aber nicht für WIN
Auf jeden fall funktioniert meine BAT Datei jetzt
Vielen dank für eure Hilfe
Verfasst: Mittwoch 23. Februar 2005, 14:30
von Milan
Dann musst du halt einen eigenen Daemon schreiben, den du die Startbefehle mitteilst (z.B. über eine Datei o.ä.) und der die Befehle dann ausführt. Außerdem bin ich mir sicher, dass das umhängen auch unter win geht. Nur da wird es wohl ein größerer Aufwand, weil du mit der WinAPI arbeiten müsstest.

Verfasst: Mittwoch 23. Februar 2005, 20:18
von Leonidas
Milan hat geschrieben:Außerdem bin ich mir sicher, dass das umhängen auch unter win geht. Nur da wird es wohl ein größerer Aufwand, weil du mit der WinAPI arbeiten müsstest.

Schade nur, dass es nicht im Windows os Modul drin ist.
Für IPC finde ich XMLRPC nett, das funktioniert sehr gut.
Verfasst: Mittwoch 23. Februar 2005, 21:52
von Milan
Jepp, da hast du recht. Ich glaube, das müsste mit win32process.CreateProcess gehen, wobei ich aber nicht weiß welche Parameter nach dem exec-String (genauer Pfad zur Datei, die ausgeführt werden soll) übergeben werden müssen...
Verfasst: Donnerstag 24. Februar 2005, 14:54
von Leonidas
Also so schwer ist das wohl nicht das ins C Modul einzubauen und fork() zu nennen.
Verfasst: Freitag 25. Februar 2005, 14:46
von Milan
gefunden - sollte mittels dem Flag CREATE_NEW_CONSOLE möglich sein, den Child unabhängig vom Parent zu machen. Nachzuschaun im Quelltext vom subprocess Modul.
# Not passing CREATE_NEW_CONSOLE has been known to
# cause random failures on win9x. Specifically a
# dialog: "Your program accessed mem currently in
# use at xxx" and a hopeful warning about the
# stability of your system. Cost is Ctrl+C wont
# kill children.
@Leonidas: Theoretisch schon. Praktisch sind aber a) die win32all nicht standartmäßig installiert und deswegen darf darauf nicht zugegriffen werden (finde ich dumm) und b) wird bei fork ja auch gleich die ganze Umgebung mitgegeben. Mit entsprchendem Aufwand ist dies bestimmt auch möglich, ich denke mal dazu ist es nur notwändig das subprocess Modul mal tiefer zu durchforsten.
Verfasst: Freitag 25. Februar 2005, 15:10
von Leonidas
Milan hat geschrieben:Praktisch sind aber a) die win32all nicht standartmäßig installiert und deswegen darf darauf nicht zugegriffen werden (finde ich dumm)
Naja, ich meinte aber diese Funktionalität (und nur diese, um fortk() zu simulieren) von pywin32 in ein C Modul zu kopieren, dass dann in Python mitgeliertert wird.
Verfasst: Freitag 25. Februar 2005, 23:57
von BlackJack
'fork()' ist POSIX Standard und wenn es davon eine Windowsversion geben sollte, dann sollte die sich auch nach dem Standard verhalten. Ich weiss nicht wie schwer oder einfach das ist.
Ansonsten: Implementier es und schick den Python-Entwicklern einen Patch.

Verfasst: Samstag 26. Februar 2005, 00:15
von Leonidas
BlackJack hat geschrieben:'fork()' ist POSIX Standard und wenn es davon eine Windowsversion geben sollte, dann sollte die sich auch nach dem Standard verhalten. Ich weiss nicht wie schwer oder einfach das ist.
Also wenn es, wie jemand sagte möglich ist, dann sollte es sich wirklich auch so verhalten. Das wäre wunderbar.
BlackJack hat geschrieben:Ansonsten: Implementier es und schick den Python-Entwicklern einen Patch.

Tja, ich habe wenig C Erfahrung, als dass ich da irgendetwas helfen könnte. Doofe sache, für mich bleibt wohl nur noch PyPy
