Probleme mit der Anzeige im Browser
peter
- perl
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
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
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
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
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
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
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