peter: Probleme mit der Anzeige im Browser

Hallo...

Mein Problem ist dieses:
Ich habe ein Perl-Skript geschrieben, welches ein Programm auf der Shell einer Unix-Maschine startet und die Daten im HTML-Format an den Browser sendet.
Einige Funktionen des Shell-Programms benötigen ein paar Sekunden, um die Daten zurückzugeben.
Wenn ich das Perl-Skript von der Kommandozeile unter Unix starte, "wartet" das Skript auf die Ausgabe der Funktion und gibt die Daten aus.
 Rufe ich das Skript jedoch von einer HTML-Seite mittels Button auf, schickt das Perl-Skript zwar eine HTML-Seite zurück, aber leider ohne die Daten des Shell Programms...

Woran kann das liegen???

Grüße Peter

  1. Halihallo peter

    Ich habe ein Perl-Skript geschrieben, welches ein Programm auf der Shell einer Unix-Maschine startet und die Daten im HTML-Format an den Browser sendet.

    Wie rufst du das Shell-Programm auf? - popen, system, Backticks, IPC::open2, IPC::open3,
    ...

    Einige Funktionen des Shell-Programms benötigen ein paar Sekunden, um die Daten zurückzugeben.

    wenn der gestartete Prozess nicht "detached" gestartet wird, wartet das Hauptprogramm
    auf das Enden jenes. Es sei denn das Shell-Programm merkt, dass es nicht unter der
    Konsole arbeitet.

    Wenn ich das Perl-Skript von der Kommandozeile unter Unix starte, "wartet" das Skript auf die Ausgabe der Funktion und gibt die Daten aus.

    So tut es auch, wenn es über den Webserver gestartet wird, das von dir beschriebene
    Phänomen hat (wahrscheinlich) nicht's damit zu tun.

    Rufe ich das Skript jedoch von einer HTML-Seite mittels Button auf, schickt das Perl-Skript zwar eine HTML-Seite zurück, aber leider ohne die Daten des Shell Programms...

    Was für eine HTML-Seite? - Ist sie mit Daten gefüllt? - Verwendest du IE (der erstellt
    nämlich ein HTML-Dokument, obwohl gar keines empfangen wurde)? - Wie sieht die HTML-Seite
    aus (ist sie mit von dir gewolltem Inhalt bestückt, oder leer)? - Wird Browser-Timeout
    erreicht? - Wie empfängst du die Daten des Shell-Programmes? - Wenn gar nicht, dann wäre
    es möglich, dass die Ausgabe des Shellprogrammes an STDERR gesendet wird[1] und somit von
    vom Webserver ggf. nicht an den Client gesendet wird (beachte auch, dass die Ausgabe von
    STDOUT gecached ist, jene von STDERR nicht und somit zu Fehlern führen kann, da der
    Webserver keinen kompletten HTTP-Header erhält). Hast du einen gültigen HTTP-Header
    gesendet? - Stehen Fehlermeldungen in dem log deines Webservers?

    => Fazit: Beschreibe ausführlich und komplett!

    [1] es somit auf der Konsole ganz artig funktioniert, jedoch die entsprechende Ausgabe
    des Shellprogrammes über HTTP-Request ausgleibt.

    Viele Grüsse

    Philipp

    1. Hallo Philipp
         Dank dir erstmal für Deine Reaktion...
         Zu Deinen Fragen:

      Wie rufst du das Shell-Programm auf? - popen, system, Backticks, IPC::open2, IPC::open3,

      Das funktioniert bei mir zum Teil mit open(DATEI,"soundso.pl |");
         Dazu ist zu sagen, dass das Programm parametisiert ist und einige   Funktionen duchaus so ihre Werte zurückgeben, zum Beispiel   Textdateien, aber auch laufende Prozesse, die ich durch "refresh"     aktuell halte.

      wenn der gestartete Prozess nicht "detached" gestartet wird, wartet das Hauptprogramm
      auf das Enden jenes. Es sei denn das Shell-Programm merkt, dass es nicht unter der
      Konsole arbeitet.

      Was heisst in diesem Zusammenhang "detached"?

      Wenn ich das Perl-Skript von der Kommandozeile unter Unix starte, "wartet" das Skript auf die Ausgabe der Funktion und gibt die Daten aus.

      So tut es auch, wenn es über den Webserver gestartet wird, das von dir beschriebene
      Phänomen hat (wahrscheinlich) nicht's damit zu tun.

      Das nehme ich auch an...

      Rufe ich das Skript jedoch von einer HTML-Seite mittels Button auf, schickt das Perl-Skript zwar eine HTML-Seite zurück, aber leider ohne die Daten des Shell Programms...

      Was für eine HTML-Seite? - Ist sie mit Daten gefüllt? - Verwendest du IE (der erstellt
      nämlich ein HTML-Dokument, obwohl gar keines empfangen wurde)? - Wie sieht die HTML-Seite
      aus (ist sie mit von dir gewolltem Inhalt bestückt, oder leer)? - Wird Browser-Timeout
      erreicht? - Wie empfängst du die Daten des Shell-Programmes? - Wenn gar nicht, dann wäre
      es möglich, dass die Ausgabe des Shellprogrammes an STDERR gesendet wird[1] und somit von
      vom Webserver ggf. nicht an den Client gesendet wird (beachte auch, dass die Ausgabe von
      STDOUT gecached ist, jene von STDERR nicht und somit zu Fehlern führen kann, da der
      Webserver keinen kompletten HTTP-Header erhält). Hast du einen gültigen HTTP-Header
      gesendet? - Stehen Fehlermeldungen in dem log deines Webservers?

      Die html-Seite, die ich zurück bekomme beinhaltet im Grunde alles,    was ich im Perl-Skript angegeben habe. Die html-Seite soll    die Ausgabe des Programms im Grunde wie auf der Konsole    darstellen, nur eben grafisch ansprechender usw.
         Wie gesagt, zum Teil geschieht dies schon, teilweise bekomme ich    genau das, was ich will, nur eben nicht bei    allen "Unterprogrammen"...
         In der error-log Datei steht übrigens nichts, einen Server-Timeout    bekomme ich auch nicht, HTTP-Header ist auch vorhanden...

      Möglicherweise liegt das Problem gar nicht so sehr bei meinen     Skripts, sondern vielmehr an der Arbeitsweise des Shell-Programms.    Dennoch ist es eigenartig, dass auf der Konsole alles ausgegeben    wird, im Browser aber eben nicht...

      Ich hoffe, ich konnte es ein wenig verständlich machen...

      Grüße Peter

      1. Wie rufst du das Shell-Programm auf? - popen, system, Backticks, IPC::open2, IPC::open3,

        Das funktioniert bei mir zum Teil mit open(DATEI,"soundso.pl |");

        Unsinn... das Perl-Skript generiert eine html-Seite. Darin befindet sich eine Tabelle und in einer <td> starte ich das Shell-Skript mit open(DATEI,"Pfad zum Programm -Parameter |")
        Dies nur zur Erklärung...
        Peter

        1. Halihallo peter

          Wie rufst du das Shell-Programm auf? - popen, system, Backticks, IPC::open2, IPC::open3,
             Das funktioniert bei mir zum Teil mit open(DATEI,"soundso.pl |");

          Unsinn... das Perl-Skript generiert eine html-Seite. Darin befindet sich eine Tabelle und in einer <td> starte ich das Shell-Skript mit open(DATEI,"Pfad zum Programm -Parameter |")

          Ich bin mir nicht sicher, würde jedoch fast wetten, dass auf der Konsole die Pipe direkt
          auf die Standardausgabe umgeleitet wird und somit vom Konsolenbetrachter gesehen wird,
          im CGI-Kontext über Webserver sieht die Sache anders aus. Der Einfachheit halber sag ich
          jetzt mal: Hier musst du die Ausgabe des Programmes explizit einlesen und an deine
          STDOUT (implizit bei print) senden. Wie wenn du eine Datei liest, da musst du die Daten
          ja auch erst einlesen und an deine StdOut senden.

          Viele Grüsse

          Philipp

          1. Hallo Philipp

            Ich bin mir nicht sicher, würde jedoch fast wetten, dass auf der Konsole die Pipe direkt
            auf die Standardausgabe umgeleitet wird und somit vom Konsolenbetrachter gesehen wird,
            im CGI-Kontext über Webserver sieht die Sache anders aus. Der Einfachheit halber sag ich
            jetzt mal: Hier musst du die Ausgabe des Programmes explizit einlesen und an deine
            STDOUT (implizit bei print) senden. Wie wenn du eine Datei liest, da musst du die Daten
            ja auch erst einlesen und an deine StdOut senden.

            Danke Dir, ich probier das mal...

            Grüße Peter

      2. Halihallo peter

        Das funktioniert bei mir zum Teil mit open(DATEI,"soundso.pl |");

        Pipes, OK.

        Dazu ist zu sagen, dass das Programm parametisiert ist und einige   Funktionen duchaus so ihre Werte zurückgeben, zum Beispiel   Textdateien, aber auch laufende Prozesse, die ich durch "refresh"     aktuell halte.

        Hä?

        wenn der gestartete Prozess nicht "detached" gestartet wird, wartet das Hauptprogramm
        auf das Enden jenes. Es sei denn das Shell-Programm merkt, dass es nicht unter der
        Konsole arbeitet.

        Was heisst in diesem Zusammenhang "detached"?

        In eigener Session, oder so, dass das Hauptprogramm nicht auf das Enden des Childs
        wartet. Nicht so wichtig.

        Die html-Seite, die ich zurück bekomme beinhaltet im Grunde alles,    was ich im Perl-Skript angegeben habe. Die html-Seite soll    die Ausgabe des Programms im Grunde wie auf der Konsole    darstellen, nur eben grafisch ansprechender usw.

        Mit anderen Worten: Es funktioniert alles, bis auf die Ausgaben der Child-Prozesse. Das
        hatte ich erwartet und erhofft.

        Möglicherweise liegt das Problem gar nicht so sehr bei meinen     Skripts, sondern vielmehr an der Arbeitsweise des Shell-Programms.    Dennoch ist es eigenartig, dass auf der Konsole alles ausgegeben    wird, im Browser aber eben nicht...

        Wenn du mit open(F,'prog.pl |');
        kannst du mit

        while (my $line=<F>) {
           print $line;
        }

        die Daten der Ausgabe von prog.pl einlesen und dann über print $line; zur Standardausgabe
        deines Scripts (STDOUT, wird zum Client gesendet) "umleiten".

        Viele Grüsse

        Philipp