CGI - Python script startet langen process an

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

CGI - Python script startet langen process an

Beitragvon nobs » Donnerstag 27. Januar 2005, 17:10

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: CGI - Python script startet langen process an

Beitragvon gerold » Mittwoch 2. Februar 2005, 18:33

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 2. Februar 2005, 18:41

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

Beitragvon nobs » Donnerstag 3. Februar 2005, 10:19

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!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 3. Februar 2005, 14:17

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

Beitragvon nobs » Donnerstag 3. Februar 2005, 14:20

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!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 3. Februar 2005, 15:34

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 3. Februar 2005, 15:47

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

Beitragvon Gast » Freitag 4. Februar 2005, 10:44

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:

Beitragvon nobs » Donnerstag 10. Februar 2005, 17:00

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

Beitragvon Milan » Mittwoch 23. Februar 2005, 14:30

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:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 23. Februar 2005, 20:18

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

Beitragvon Milan » Mittwoch 23. Februar 2005, 21: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...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 24. Februar 2005, 14:54

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

Beitragvon Milan » Freitag 25. Februar 2005, 14:46

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder