Martina: Perlscript aus Perlscript aufrufen als Hintergrundprozess

Hallo Leute!

Ich möchte gerne ein Perlscript aus einem Perlscript aufrufen (vom Browser aus), welches einige Zeit dauert abzuarbeiten, will aber nicht, dass ich das abwarten will.
Es soll aber auch nicht der Prozess abgebrochen werden, wenn das Browserfenster geschlossen wird....

Weiß jemand Rat!

gruss,
Martina

  1. Ich möchte gerne ein Perlscript aus einem Perlscript aufrufen (vom Browser aus), welches einige Zeit dauert abzuarbeiten, will aber nicht, dass ich das abwarten will.

    Es gibt mehrere Möglichkeiten aus einem CGI Skript heraus ein Perl skript auszuführen.

    Es soll aber auch nicht der Prozess abgebrochen werden, wenn das Browserfenster geschlossen wird....

    Wird es auch nicht. Ein CGI Programm läuft solange bis es fertig ist unabhängig vom Browser.

    Weiß jemand Rat!

    Kommt drauf an was du wirklich willst.

    Struppi.

    1. Hallo Struppi,

      Es soll aber auch nicht der Prozess abgebrochen werden, wenn das Browserfenster geschlossen
      wird....

      Wird es auch nicht. Ein CGI Programm läuft solange bis es fertig ist unabhängig vom Browser.

      Das ist nicht wahr. Wird die Verbindung abgebrochen (z. B. durch drücken von ESC), dann wird
      zuerst ein SIGTERM und etwas später ein SIGKILL an das Perlscript geschickt.

      Grüße,
       CK

      --
      Sein oder nicht sein, das ist hier die Frage!
      1. Wird es auch nicht. Ein CGI Programm läuft solange bis es fertig ist unabhängig vom Browser.

        Das ist nicht wahr. Wird die Verbindung abgebrochen (z. B. durch drücken von ESC), dann wird
        zuerst ein SIGTERM und etwas später ein SIGKILL an das Perlscript geschickt.

        Ich glaub dir ja gerne, aber welche Verbindung?
        Ich ging immer davon aus, dass http ein verbindungsloses Protokoll ist.

        Struppi.

        1. Hallo Struppi,

          Wird es auch nicht. Ein CGI Programm läuft solange bis es fertig ist unabhängig vom
          Browser.

          Das ist nicht wahr. Wird die Verbindung abgebrochen (z. B. durch drücken von ESC), dann wird
          zuerst ein SIGTERM und etwas später ein SIGKILL an das Perlscript geschickt.

          Ich glaub dir ja gerne, aber welche Verbindung?
          Ich ging immer davon aus, dass http ein verbindungsloses Protokoll ist.

          Unterhalb von HTTP liegt TCP. Und TCP ist durchaus nicht "verbindungslos". _Wenigstens_ ein
          Request wird über eine TCP-Verbindung abgehandelt.

          Grüße,
           CK

          --
          "Ich muss auflegen, mein Essen ist gleich fertig."
          "Oh, was gibt 's denn?"
          "Hmm. Die Packung liegt schon im Muell, keine Ahnung.
          1. Hallo Christian Kruse

            Hallo Struppi,

            Wird es auch nicht. Ein CGI Programm läuft solange bis es fertig ist unabhängig vom
            Browser.

            Das ist nicht wahr. Wird die Verbindung abgebrochen (z. B. durch drücken von ESC), dann wird
            zuerst ein SIGTERM und etwas später ein SIGKILL an das Perlscript geschickt.

            Ich glaub dir ja gerne, aber welche Verbindung?
            Ich ging immer davon aus, dass http ein verbindungsloses Protokoll ist.

            Unterhalb von HTTP liegt TCP. Und TCP ist durchaus nicht "verbindungslos". _Wenigstens_ ein
            Request wird über eine TCP-Verbindung abgehandelt.

            also, nach dem was du erklärst, stößt der Browser ein CGI Programm an, während dessen unterhalten sich diese und wenn ich während der "Unterhaltung" auf ESC drücke, wird das Programm beendet?

            Das ist nicht so, wie ich mir das bisher vorgestellt habe.

            Struppi.

            1. Hallo Struppi,

              Unterhalb von HTTP liegt TCP. Und TCP ist durchaus nicht "verbindungslos". _Wenigstens_ ein
              Request wird über eine TCP-Verbindung abgehandelt.

              also, nach dem was du erklärst, stößt der Browser ein CGI Programm an, während dessen
              unterhalten sich diese und wenn ich während der "Unterhaltung" auf ESC drücke, wird das
              Programm beendet?

              Korrekt. Erst wird SIGTERM und danach SIGKILL geschickt.

              Das ist nicht so, wie ich mir das bisher vorgestellt habe.

              Krkr ;-)

              Grüße,
               CK

              --
              Kommt ein Vektor zur Drogenberatung: "Hilfe, ich bin linear abhaengig!"
              1. Korrekt. Erst wird SIGTERM und danach SIGKILL geschickt.

                Also bei mir nicht:

                #!/usr/bin/perl -w
                print "Content-type: text/plain\n\n",'hallo';

                while (1) {}

                ich muss das Programm abschiessen (Win95/OmniHTTP), wenn ich ESC drücke ist der Task nach wie vor vorhanden.

                Struppi.

                1. Hallo Struppi,

                  ich muss das Programm abschiessen (Win95/OmniHTTP), wenn ich ESC drücke ist der Task nach wie
                  vor vorhanden.

                  Wie das bei anderen Webservern als dem Apache unter *nix aussieht, weiss ich nicht.

                  Grüße,
                   CK

                  --
                  Der Mund ist das Portal zum Unglück.
    2. Kann ich also folgendes machen....

      http://www.test.de/skript.pl

      und dann den Browser auch einfach schließen....
      Läuft es dann weiter...

      Gruss,
      Martina

      1. Kann ich also folgendes machen....

        http://www.test.de/skript.pl

        und dann den Browser auch einfach schließen....
        Läuft es dann weiter...

        ja, bis es fertig ist.

        Struppi.

        1. Hallo,

          Kann ich also folgendes machen....
          http://www.test.de/skript.pl
          und dann den Browser auch einfach schließen....
          Läuft es dann weiter...
          ja, bis es fertig ist.

          Es kommt drauf an, was "ES" macht. Wenn es eine Socket-Verbindung herstellt, um Daten zu übertragen, und diese von der anderen Seite unterbrochen wird, dann _kann_ es nicht fertig werden. Oder?

          Deine Endlosschleife läuft _natürlich_ weiter. Woher sollte sie auch merken, dass der Gegenpart nicht mehr existiert?

          viele Grüße

          Axel

          1. Hallo nochmal,

            Deine Endlosschleife läuft _natürlich_ weiter. Woher sollte sie auch merken, dass der Gegenpart nicht mehr existiert?

            Ich hab grade nochmal nachgesehen. Du schreibst ja vor der Endlosschleife schon in die Socket-Verbindung. Dann liegt es bei Dir daran, dass sich der Perl-Interpreter in der Endlosschleife verselbständigt. OmniHTTP merkt, dass der Socket nicht mehr existiert, kann das aber dem 100%-ig beschäftigten Perl nicht mitteilen. Da ist natürlich UNIX im Vorteil. KILL heißt eben dort "Stirb, Prozess, ohne Diskussion!".

            viele Grüße

            Axel

          2. Hallo Axel,

            Deine Endlosschleife läuft _natürlich_ weiter. Woher sollte sie auch merken, dass der Gegenpart nicht mehr existiert?

            Das Script merkt so oder so nicht direkt, ob die Verbindung abgebrochen wurde. Der Server aber merkt das sofort.
            Der Apache beendet das Script, Omni HTTPD tut es offensichtlich nicht.
            Damit, was was Script tut, hat das aber nichts zu tun.

            Grüße

            Daniel

  2. hi,

    Ich möchte gerne ein Perlscript aus einem Perlscript aufrufen (vom Browser aus), welches einige Zeit dauert abzuarbeiten, will aber nicht, dass ich das abwarten will.
    Es soll aber auch nicht der Prozess abgebrochen werden, wenn das Browserfenster geschlossen wird....

    Schick das ext. Script mit & in den Hintergrund, am besten mit
    exec('script', '&');

    /rolf

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
    1. Hallo Erwin,

      Schick das ext. Script mit & in den Hintergrund, am besten mit
      exec('script', '&');

      *Bitte* *nicht*.
      Wie es richtig geht, habe ich schon öfter erwähnt:

      use POSIX qw/setsid/;

      my $pid = fork();
      die $! unless defined $pid;
      if($pid == 0) {
        die $! unless setsid();
      }
      else {
        exit();
      }

      close STDIN;
      close STDOUT;
      close STDERR;

      Grüße,
       CK

      --
      Fatal! Ich kann kein Reserve-Offizier mehr sein!
      1. Schreib ich das einfach am Anfang des Skripts oder was?
        Und dann kann ich den Browser schließen????

        1. Hallo Martina,

          Schreib ich das einfach am Anfang des Skripts oder was?

          Ja. Die Erklärung dazu findest du im Archiv.

          Und dann kann ich den Browser schließen????

          Ja.

          Grüße,
           CK

          --
          Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
          1. Nach was muss ich im Archiv suchen

            1. Hallo Martina,

              Nach was muss ich im Archiv suchen

              nach 'fork setsid' im Archiv von 2002.

              Grüße,
               CK

              --
              Der Mund ist das Portal zum Unglück.
      2. hi Chris,

        Schick das ext. Script mit & in den Hintergrund, am besten mit
        exec('script', '&');

        *Bitte* *nicht*.
        Wie es richtig geht, habe ich schon öfter erwähnt:

        use POSIX qw/setsid/;

        my $pid = fork();
        die $! unless defined $pid;
        if($pid == 0) {
          die $! unless setsid();
        }
        else {
          exit();
        }

        close STDIN;
        close STDOUT;
        close STDERR;

        Das ist gut! Darf ich das auf die PerlBase tun? Dein Name darunter?

        Gruss, Rolf

        --
        SELFforum - Das Tor zur Welt!
        Theoretiker: Wie kommt das Kupfer in die Leitung?
        Praktiker: Wie kommt der Strom in die Leitung?
        1. Hallo Erwin,

          Das ist gut! Darf ich das auf die PerlBase tun? Dein Name darunter?

          Klar.

          Grüße,
           CK

          --
          Nichts zu begehren, das ist der Weg.
          1. Mahlzeit CK,

            Das ist gut! Darf ich das auf die PerlBase tun? Dein Name darunter?

            Klar.

            Vielen Dank!

            http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=5.1&id=3

            Gruss, Erwin

            --
            SELFforum - Das Tor zur Welt!
            Theoretiker: Wie kommt das Kupfer in die Leitung?
            Praktiker: Wie kommt der Strom in die Leitung?
      3. Aber bei else kommt bei dir exit()
        dann wird doch alles was danach kommt nicht mehr ausgeführt???

        Gruss,
        Martina

        1. Hallo Martina,

          Aber bei else kommt bei dir exit()
          dann wird doch alles was danach kommt nicht mehr ausgeführt???

          Doch. Vorher wird ge-fork()-et.

          Grüße,
           CK

          --
          Willst du die Freuden dieser Welt geniessen, so musst du auch ihr Leid erdulden.
          1. Nochmal zur Kontrolle  ***nerv***

            Ich soll zu beginn meines Skriptes, welches ausgeführt werden soll (also am Anfang bevor der Rest des Quellcodes kommt) deinen Code einfügen...

            Gruss,
            Martina

            1. Hallo Martina,

              Ich soll zu beginn meines Skriptes, welches ausgeführt werden soll (also am Anfang bevor der
              Rest des Quellcodes kommt) deinen Code einfügen...

              Immer noch, ja.

              Grüße,
               CK

              --
              <zentrum> wie war noch mal die option in make.conf fuer das benutzen von pipes um das compile zu beschluenigen?
              <CK1> CFLAGS="-pipe"
              <torsten> Oder man frage einen Gentooer seiner Wahl, wie man 2 km Compilerswitches fuer seine CPU hinbekommt ;)
              1. Danke und sorry für das Nerven ***grins***

                Gruss, Martina

                1. Es funktioniert....echt super....
                  Gruss, Martina

              2. So jetzt habe ich doch noch eine Frage!

                Wie kann ich verhindern bzw. Abfragen, ob der Prozess schon beendet ist, so dass nicht ein zweitesmal in der selben Dauer(Zeit) das Skript gestartet wird.

                Gruss,
                M.

  3. Jetzt gibt es wieder ein Problem...
    Wenn ich es vom Browser aufrufe gibt es einen Internal Server Error...
    Das Skript arbeitet aber...also funktioniert...
    Aber in meiner error-log-file steht dann...

    premature end of script headers.....????

    Gruss,
    M.