Thomas: Wie geht es nun wirklich ??? fork, exec & Co

Hallo zusammen,

jetzt habe ich keine Lust mehr zu suchen. Wie kann ich denn nun mit "fork, exec & Co" einen Parent-Prozess als beendet markieren und einen Child-Prozess weiter laufen lassen?
Nun noch ein wenig genauer:

  • es gibt zwei Scripte
  • eins davon ist der erste Prozess, indem das zweite Script gestartet wird
  • das Zweite Script könnte aber einige Zeit dauern (bis zu einigen 100 Minuten)

Wie koppel ich nun die beiden Prozesse voneinander ab?

1. erstes Script starten und verarbeiten
2. in diesem Prozess das zweite Script starten
3. erstes Script beenden mit HTML-Ausgabe
4. zweites Script läuft weiter bis Ende

Dazu zu sagen ist, daß ich ActivePerl nutze und das es auf einem NT-Server läuft.

Nett wäre eine kleine Syntax-Erklärung. Denn weder in diesem großen Super-Archiv noch in irgendwelchen anderen Foren hatte ich Glück einmal einen eindeutigen Quellcode zu finden. Auch in den gefundenen Dokumentationen bringt leider niemand mal ein Beispiel.

Ich hoffe Mein Problem verständlich geschildert zu haben. Wenn nicht, einfach fragen. In den nächsten Tagen werde ich sehr regelmäßig nach Antworten schauen.

Schon großen Dank an alle Helfer

Thomas

  1. Hallo zusammen,

    jetzt habe ich keine Lust mehr zu suchen. Wie kann ich denn nun mit "fork, exec & Co" einen Parent-Prozess als beendet markieren und einen Child-Prozess weiter laufen lassen?
    Nun noch ein wenig genauer:

    • es gibt zwei Scripte
    • eins davon ist der erste Prozess, indem das zweite Script gestartet wird
    • das Zweite Script könnte aber einige Zeit dauern (bis zu einigen 100 Minuten)

    Wie koppel ich nun die beiden Prozesse voneinander ab?

    1. erstes Script starten und verarbeiten
    2. in diesem Prozess das zweite Script starten
    3. erstes Script beenden mit HTML-Ausgabe
    4. zweites Script läuft weiter bis Ende

    Kein Problem. Unter Unix gibt es da die Funktionen fork und setsid. Damit kannst du dem 2. Script unendlich Timeout verschaffen. Ich hab schon mal ne genaue Anleitung dazu gepostet. Mehrfach. Sollte im Archiv zu finden sein.

    Dazu zu sagen ist, daß ich ActivePerl nutze und das es auf einem NT-Server läuft.

    Kleine Korrektur, doch nen Problem. Fork geht AFAIK unter NT nicht, genausowenig wie setsid.

    Nett wäre eine kleine Syntax-Erklärung. Denn weder in diesem großen Super-Archiv noch in irgendwelchen anderen Foren hatte ich Glück einmal einen eindeutigen Quellcode zu finden. Auch in den gefundenen Dokumentationen bringt leider niemand mal ein Beispiel.

    Such einfach mal nach Erik Tews und schau dir die Nachrichten an, die was mit CGI-Timeout zu tun haben.

  2. jetzt habe ich keine Lust mehr zu suchen. Wie kann ich denn nun mit "fork, exec & Co" einen Parent-Prozess als beendet markieren und einen Child-Prozess weiter laufen lassen?

    Ich fürchte, *so* geht es überhaupt nicht. Wenn der Child-Prozeß wirklich ein Child-Prozeß ist. bekommt er normalerweise Probleme, wenn sein Parent-Prozeß nicht mehr existiert.

    Bei fork () erzeugst Du (unter UNIX) einen solchen child-Prozeß. Im Prinzip wird der Adreßraum des Parent-Prozesses dupliziert und das child springt an eine im Aufruf angegebene Adresse. Wird das Child beendet, dann erhält der Parent automatisch ein SIG_CHILD-Signal - die beiden wissen also noch voneinander.

    exec () macht etwas ganz Anderes: Es überschreibt den Adreßraum des vorherigen Prozesses. Während dieser nach system() an der vorherigen Stelle fortgesetzt wird, ist er nach exec() einfach "nicht mehr da". Tatsächlich existiert genau der ursprüngliche Prozeß weiter, führt aber nun eben das neue Kommando aus.

    Wie koppel ich nun die beiden Prozesse voneinander ab?

    Was Du wahrscheinlich brauchst, ist ein ganz normales Systemkommando, aber mit dem Operator "&" am Ende. Der sorgt dafür, daß der Prozeß vom Parent sauber abgetrennt wird - und dann sollte er auch dessen Ende überstehen.
    Auch das Systemkommando "nohup" macht etwas Ähnliches - mit den Details bin ich nicht vertraut. (UNIX-manpages.)

    Dazu zu sagen ist, daß ich ActivePerl nutze und das es auf einem NT-Server läuft.

    Tja, Windows NT ist nicht UNIX - da gilt wahrscheinlich nichts des oben Gesagten.

    Die Sprache ist für das Prozeßmodell des Betriebssystems irrelevant - was ich erzählt habe, geht in Perl oder C oder irgendwas gleichermaßen, wenn das Betriebssystem es unterstützt. Und wenn nicht, dann nicht.

    Ich hoffe Mein Problem verständlich geschildert zu haben.

    Hast Du (IMHO). Aber was Dein Server genau kann, darüber weiß ich zu wenig.

  3. Hallo Erik und Michael,

    schon mal vielen Dank für Eure Erklärungen. Haben mir leider nur gezeigt, daß ich doch noch einiges zu lernen habe. Denn bis jetzt habe ich weder mit Eriks Quellcode noch mit dem system ("... &") Befehl Erfolg.
    Bei der Systemversion habe ich das Gefühl, daß es nicht klappt wenn ich

    system ("perl script.pl &");

    schreibe. Dies muß ich aber, beim Offlinetest, sonst wird das zweite Script nicht gestartet. Liegt das daran, daß mein WIN95 system eine "... .pl" Datei nicht automatisch dem Perl-Interpreter zugewiesen wird? Der "&"-Parameter wird jedenfalls nicht so erkannt, wie ich gern hätte. Zwei Testscripte bewiesen mir, daß das zweite Script erst beendet wird, bevor das erste weiter arbeitet und beendet.

    Nun zwei Fragen:
    1. Kann mir jemand sagen, wie ich unter WIN95 eine PL-Extension automatisch auf die gewünschte Perl.exe gegeben wird?
    2. Oder warum wird mit dem "&"-Parameter nicht ein neuer unabhängiger Prozess gestartet?

    Vielen Dank schon mal

    Thomas