CGI - Python script startet langen process an

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nobs
User
Beiträge: 13
Registriert: Donnerstag 27. Januar 2005, 16:43
Kontaktdaten:

Hallo Leute

Habe ein wenig gesucht aber nix gefunden :cry:

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 :(
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich würde os.system() vorschlagen, das startet Prozesse asyncron. Ist aber nur ein Schuss ins Blaue.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nobs
User
Beiträge: 13
Registriert: Donnerstag 27. Januar 2005, 16:43
Kontaktdaten:

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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst os.system() in einem Thread aufrufen.. nur warscheinlich wird der aufgrufene Prozess gekillt, wenn der Thread endet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nobs
User
Beiträge: 13
Registriert: Donnerstag 27. Januar 2005, 16:43
Kontaktdaten:

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" :wink:
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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn du mir den Code, den du gefunden hast mal zeigst, dann kann ich mal gucken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...
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!
nobs
User
Beiträge: 13
Registriert: Donnerstag 27. Januar 2005, 16:43
Kontaktdaten:

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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. :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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. :wink:
Schade nur, dass es nicht im Windows os Modul drin ist.

Für IPC finde ich XMLRPC nett, das funktioniert sehr gut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also so schwer ist das wohl nicht das ins C Modul einzubauen und fork() zu nennen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten