Kein Timeout im Browser
Torsten
- cgi
Hallo,
ich bins mal wieder.
Mein CGI-Script läuft soweit supi, auch das Java-Rrogramm im Hintergrund.
Jedoch gibt es jetzt schon wieder ein neues Prob. Dauert der Ablauf des Java-Programmes zu lang, kommt im Browser automatisch: Die Seite kann nicht angezeigt werden. Wie kann ich das unterbinden und die Seitenaktualisierung des Browsers wirklich abwartet, bis das Java-Programm fertig ist?
MFG
Torsten
Jedoch gibt es jetzt schon wieder ein neues Prob. Dauert der Ablauf des Java-Programmes zu lang, kommt im Browser automatisch: Die Seite kann nicht angezeigt werden. Wie kann ich das unterbinden und die Seitenaktualisierung des Browsers wirklich abwartet, bis das Java-Programm fertig ist?
Hast du JavaRuntime installiert?
Ja, die Java-Runtime ist installiert.
ISt das eine HTML-Anweisung oder geschieht das in meinem Falle über Perl oder geht das noch ganz anders?
MFG
Torsten
Ja, die Java-Runtime ist installiert.
ISt das eine HTML-Anweisung oder geschieht das in meinem Falle über Perl oder geht das noch ganz anders?
Hallo Torsten ich habe gemeint das es villeicht an deinem PC Liegt warum der Java so lansam läuft.
Hier gibts den zum download
http://www.java.com/de/download/manual.jsp
Nein, das liegt am Programm, es hat ein haufen Operationen und Dateiarbeit auszuführen und nebenbei noch andere Scripte. Deswegen möchte ich ja von vornherein den Timeout beim Browser deaktivieren oder etwas ähnliches, das wirklich erst gewartet wird, bis das Java-Prog fertig ist.
MFG
Torsten
Hier ein handbuch.
http://www.cisco.com/en/US/products/sw/secursw/ps5318/products_user_guide_chapter09186a0080556a7b.html
viel glück :-)
Ich wollte da eigentlich keine Tagesaufgabe daraus machen. Ich hätte gedacht das es da irgend eine Funktion, wegen mir in Perl oder JS gibt.
In meinem Perl-CGI-Script wird ein Java-Programm gestartet und bei Beendigung einfach der Output des Programmes angezeigt.
Ich wüßte jetzt gar nicht, wo ich irgend eine Endlosschleife einbringen soll, und was ich dann an den Client senden soll. Das ganze müßte ja dann im CGI-Script realisiert werden, oder? Bin leider noch nicht so der Perl-Profi.
MFG
Torsten
Ich habe von der Seite
[link http://72.14.207.104/search?q=cache:8YaWLye5SAIJ:www.netzmafia.de/skripten/perl/perl4.html+cgi-script+timeout+verhindern&hl=de&gl=de&ct=clnk&cd=9 link]
ein wenig übernommen:
$SIG{'ALRM'} =&alarm_handle;
alarm(2400);
sub alarm_handle
{
alarm(0);
print'<P><h2>Fehler</h2><br>';
print'</BODY></HTML>';
exit 0;
}
Und trotdem erscheint nach ca. 6 bis 7 Minuten die Meldung, dass die Seite nicht angezeigt werden kann, obwohl im Script die Dauer auf 40!!! Minuten erhöht worden ist, und das Unterprogramm alarm_handle wird anscheint auch net abgearbeitet.
Komme hier nicht mehr weiter. Kennt sich jemand damit aus?
MFG
Torsten
Hallo,
ich nehme an, es dreht sich nun um die Umsetzung von http://forum.de.selfhtml.org/archiv/2006/2/t123254/
Ich habe von der Seite
http://72.14.207.104/search?q=cache:8YaWLye5SAIJ:www.netzmafia.de/skripten/perl/perl4.html+cgi-script+timeout+verhindern&hl=de&gl=de&ct=clnk&cd=9ein wenig übernommen:
$SIG{'ALRM'} =&alarm_handle;
alarm(2400);
Dieser Handler sorgt für einen _Abbruch des Perl-Scripts_, welches _auf dem Server_ ausgeführt wird - das geht auch klar aus der Beschreibung des Programms hervor. Der Browser bricht die Verbindung zum Server _mangels Datenübertragung_ ab. Serverseitige Prozesse haben keinerlei Einfluß auf clientenseitige Prozesse.
_Nach wie vor_ halte ich ein Aufspalten in verschiedene Prozesse für sinnvoll: fork()
- spalte einen Prozess ab, der unabhängig vom Serverprozess das Java-Programm
ausführt
- lasse den Prozess ein Log-File am Ende erstellen
- schreibe ein weiteres Script, was nachschaut, ab das Log-File angelegt ist
und ggf. zur Anzeige bringt und löscht
(War da nicht noch was mit User-Eingaben oder lies sich das inzwischen per Parameter regeln?)
Gruß aus Berlin!
eddi
Hallo Eddi,
gestartet wird ein Script mit einem form-tag, in welchem die ganzen Parameter eigegeben werden müssen, beim Druck auf den Submit-Buttom wird das Script erneut gestartet, jedoch durch if-Anweisungen nun das Java-Programm ausgeführt.
Und in welchem Prozess bzw. welchem Script verhindere ich dann das Timeout? Was muß welches Script dann an den Browser senden?
Viele Grüße
Torsten
Re:
gestartet wird ein Script mit einem form-tag, in welchem die ganzen Parameter eigegeben werden müssen, beim Druck auf den Submit-Buttom wird das Script erneut gestartet, jedoch durch if-Anweisungen nun das Java-Programm ausgeführt.
Und in welchem Prozess bzw. welchem Script verhindere ich dann das Timeout? Was muß welches Script dann an den Browser senden?
Das läßt sich nicht verhindern. Aber wenn Du einen Prozess abspaltest, der das Java-Programm ausführt, kann der Parentprozess mit einer Meldung à la "Porzess läuft" geschlossen werden. Der Childprozess erstellt, wie bereits beschrieben, nach Beendigung des Java-Programms eine Log-Datei. (Script 1)
Nun zu Script 2:
Dieses prüft bei jedem Request, ob eine Log-Datei existiert. Ist keine da => Rückgabe "Prozess noch am laufen". Ist eine da => Ausgabe der Datei mit HTML-Formular für Löschaktion.
Wenn Du es etwas eleganter haben willst, das Du ohne Zutun bei Beedigung benachrichtigt wirst, dann sieh mal unter http://forum.de.selfhtml.org/archiv/2006/1/t122439/#m787599. (Ganz elegant wäre es dann mittels Socket im Script 1 und einer kleinen HTTP-Behandlungsroutine. Dann käme auch wieder die Idee mit dem Applet aufs Tapet.)
Gruß aus Berlin!
eddi
Das läßt sich nicht verhindern. Aber wenn Du einen Prozess abspaltest, der das Java-Programm ausführt, kann der Parentprozess mit einer Meldung à la "Porzess läuft" geschlossen werden. Der Childprozess erstellt, wie bereits beschrieben, nach Beendigung des Java-Programms eine Log-Datei. (Script 1)
Und wie beende ich dann den Child-Prozess? Oder beendet sich dieser autoamtisch?
Nun zu Script 2:
Dieses prüft bei jedem Request, ob eine Log-Datei existiert. Ist keine da => Rückgabe "Prozess noch am laufen". Ist eine da => Ausgabe der Datei mit HTML-Formular für Löschaktion.
Ahso, verstehe, ich lasse in die log-Datei die Ausgaben des Java-PRogramms über mein CGI-Script schreiben. Aber wie verbinde starte ich dann Script 2 zusammen mit Script 1?
MFG
Torsten
Ok, den Child-Prozess kann ich mit exit() beenden, aber müßte der Elternprozess nicht mittels wait() auf die Beendigung des Kind-Prozesses warten?
MFG
Torsten
my $pid = fork();
if ($pid == 0) # Kind-Prozess
{
my @output=$call
;
# Dateiarbeit -> jedes $_ des @output in logfile
exit();
}
else # Elternprozess
{
print '<br><span style="font-family:Arial; font-size:10pt">Ihre Anfrage wird bearbeitet...<br></span>';
wait();
}
Ist das soweit richtig?
Wie und wo würde ich aber die Kommunikation mit dem 2. Script herstellen? Oder sollte das 2. Script auch für eine 2. unabhängige InternetSeite sein?
MFG
Torsten
Neinnnn,
ich merke gerade, dass dein beim Erzeugen der Seite nach submit die Seite 2mal untereinander angezeigt wird. wenn ich fork() verwenden will, dann müßte ich ja nun mein ganzes Script von vorn erneuern und nur den parent-prozess in die anzeige einbeziehen.
müßte das java-programm nicht auch zuende arbeiten, wenn man alles ohne fork() erledigt, das programm startet und einfach über print eine mitteilung sendet? oder kommt dann trotzdem: seite nicht gefunden?
MFG
Torsten
ich merke gerade, dass dein beim Erzeugen der Seite nach submit die Seite 2mal untereinander angezeigt wird. wenn ich fork() verwenden will, dann müßte ich ja nun mein ganzes Script von vorn erneuern und nur den parent-prozess in die anzeige einbeziehen.
Ich glaube du hast nicht ganz verstanden was fork macht. Soweit ich weiß, wird ein neuer Prozeß erzeugt, in dem dann deine Anwendung läuft. Das passiert dann paralell zum Hauptprozess, der sich dann nicht mehr weiter um diesen kümmert. also kein exit nichts.
Dieser Prozess erstellt nach beenden eine Log Datei (lt. eddi)
Jetzt musst du nur den Browser dazu bringen in einem Interval dein Skript aufzurufen, dass dann prüft ob diese Datei existiert.
müßte das java-programm nicht auch zuende arbeiten, wenn man alles ohne fork() erledigt, das programm startet und einfach über print eine mitteilung sendet? oder kommt dann trotzdem: seite nicht gefunden?
Damit wärst du wieder ganz am Anfang, nein, du erhälst offenichtlich einen Timeout.
Sag mal, wie lange läuft denn dein Java?
Struppi.
ich merke gerade, dass dein beim Erzeugen der Seite nach submit die Seite 2mal untereinander angezeigt wird. wenn ich fork() verwenden will, dann müßte ich ja nun mein ganzes Script von vorn erneuern und nur den parent-prozess in die anzeige einbeziehen.
Ich glaube du hast nicht ganz verstanden was fork macht. Soweit ich weiß, wird ein neuer Prozeß erzeugt, in dem dann deine Anwendung läuft. Das passiert dann paralell zum Hauptprozess, der sich dann nicht mehr weiter um diesen kümmert. also kein exit nichts.
dann lasse ich also das wait() und exit() einfach weg?
Dann schreibe ich mein Script entsrpechend um und erzeuge gleich als aller erstes im scripüt mittels fork() ein Kindprozess zum Ausführen der Java-Datei und schreiben der Log-Datei, sobald ein submit abgesendet wurde. Alles andere erledige ich im Eltern-Prozess, sehe ich das richtig?
Dieser Prozess erstellt nach beenden eine Log Datei (lt. eddi)
Jetzt musst du nur den Browser dazu bringen in einem Interval dein Skript aufzurufen, dass dann prüft ob diese Datei existiert.müßte das java-programm nicht auch zuende arbeiten, wenn man alles ohne fork() erledigt, das programm startet und einfach über print eine mitteilung sendet? oder kommt dann trotzdem: seite nicht gefunden?
Damit wärst du wieder ganz am Anfang, nein, du erhälst offenichtlich einen Timeout.
Sag mal, wie lange läuft denn dein Java?
Das Programm läuft je nach Datenumfang und gewünschter Funktionalität bis zu 10 Minuten.
Struppi.
MFG
Torsten
Ich glaube du hast nicht ganz verstanden was fork macht. Soweit ich weiß, wird ein neuer Prozeß erzeugt, in dem dann deine Anwendung läuft. Das passiert dann paralell zum Hauptprozess, der sich dann nicht mehr weiter um diesen kümmert. also kein exit nichts.
dann lasse ich also das wait() und exit() einfach weg?
Da mich mit Linux & co nicht auskenne (unter Win läuft fork nicht) vermute ich soweit ich das verstanden habe, ja (es gibt sicher im Internet irgendwo eine Erläuterung wie das mit fork abläuft)
Dann schreibe ich mein Script entsrpechend um und erzeuge gleich als aller erstes im scripüt mittels fork() ein Kindprozess zum Ausführen der Java-Datei und schreiben der Log-Datei, sobald ein submit abgesendet wurde. Alles andere erledige ich im Eltern-Prozess, sehe ich das richtig?
Ja.
wobei du aber evtl. darauf achten willst, das das Java programm nicht mehrmals aufgerufen wird.
Sag mal, wie lange läuft denn dein Java?
Das Programm läuft je nach Datenumfang und gewünschter Funktionalität bis zu 10 Minuten.
Ist das sinnvoll über den Browser zu steuern?
Du musst ja in dem Falle bis zu 10 Minuten, immer wieder das Skript aufrufen und checken ob das Programm fertig ist.
Ich hab keine Ahnung was das Javaprg. macht, aber vielleicht ist das eher eine Aufgabe für einen cron Job?
Struppi.
Ist das sinnvoll über den Browser zu steuern?
Das wird von höherer Stelle so gewünscht
Du musst ja in dem Falle bis zu 10 Minuten, immer wieder das Skript aufrufen und checken ob das Programm fertig ist.
Ich hab keine Ahnung was das Javaprg. macht, aber vielleicht ist das eher eine Aufgabe für einen cron Job?
Dieses Programm erzeugt für einen Server eine Art Reparaturinstallion. Deswegen scheidet Cronjob oder Ähnliches schon mal aus. Grundsätzlich wird das Prog. auch von der Konsole gestartet. Nun jedoch, auf Wunsch zur besseren Bedienbarkeit soll auch der Start vom Browser aus möglich sein.
MFG
Torsten
Ich habe das Script jetzt erstmal probehalber umgestellt. Aber nun erscheint immer ein Fehler beim Aufruf der Seite im Browser und sie wird gar nicht erst angezeigt. Wo könnte der Fehler liegen?
use strict;
use warnings;
use CGI;
use Date::Calc qw(:all);
use Data::Dumper;
use XML::Parser;
my $q = new CGI;
my %parms=$q->Vars;
my $tmppath="/tmp/";
my $pid = fork();
if ($pid != 0) # Elternprozess
{
header();
if ($parms{status} != 6)
{
parameter();
}
if ($parms{status} == 6)
if ( $parms{ircreate} ne "ircreate" )
{
anzeige();
}
if ( $parms{ircreate} eq "ircreate" )
{
anzeigeIRCreate();
}
}
footer();
}
exit;
MFG
Torsten
Oh man, es tut mir leid, wenn ich hier langsam anfange, zu nerven. Bei der Fehlersuche sollte man doch zu erst auf die Klammersetzung schauen. Nochmals sorry!!!
MFG
Torsten
Moin.
Oh man, es tut mir leid, wenn ich hier langsam anfange, zu nerven.
OmG trink Tee mit Honig, halt die Füße still und kozentrier Dich ;)
Der Child-Prozess beendet sich selbst, sollte aber mit explizit exit() ab-
geschossen werden nachdem es die Ausgabe des Java-Programms in der Log ab-
gefaßt hat.
Das zwiete Script, was auf die Existens des Log-Files prüft, wird vom
Browser aufgerufen. Ob Du dabei in der Ausgabe des Parent-Prozesses einen
Verweis darauf gibst, oder aber formschön mit Statuscode 303 See Other
und Location (vgl. Perl: senden eines HTTP-Headers) dafür Methoden HTTPs
nutzt, ist Dein Bier. Jedenfalls müßte händisch dafür gesorgt werden, das
der Browser das zweite Script in gewissen Abständen ausführt. (Wie gesagt,
es ginge auch noch eleganter...)
Wartet Parent aus Child hast Du wieder ein Problem mit dem einsetzenden
Timeout des Browsers, nur das in diesem Falle Child weiterlaufen wird.
Schreibe zu diesem Zweck ersteinmal ein KonsolenScript, und sieh Dir in
den Prozesstabelle an, was da überhaupt geschieht.
Jein. Auf wait() würde im Elternprozess verzichten. Zur Kommunikation mit
dem zweiten Script wird der Webserver via Browser genutzt:
Browser fragt bei Server an (Request)
Server führt das zweite PerlScript aus
Script fragt FS ob File da
Script gibt Server bescheid
Server gibt Browser bescheid (Response)
Wie das bei Perl geregelt ist, weiß ich offengestanden nicht. Für ge-
wöhnlich sorgt ein Webserver bei Verbindungsabbrüchen dafür, daß das
Script stoppt. Das hängt auch vom Server ab. Probiere es mit einem Sig-
nalhandler aus, ob das Script ein Signal bekommt, bzw. sieh beim Testen
dazu in die Prozesstabelle weil manche Signale schlichtweg nicht aufge-
fangen werden können/dürfen.
Welche Fehlermeldung wird ausgegeben?
Abschließend, nebst der Frage -wo es jetzt noch Probleme gibt-, erlaube ich mir _nochmals_ anzumerken, daß es in den seltensten Fällen eine Gute Idee[TM] ist, mit einer neuen Sprache anzufangen und damit etwas komplexe Aufgaben anzupacken.
Gruß aus Berlin!
eddi
Nein, das liegt am Programm, es hat ein haufen Operationen und Dateiarbeit auszuführen und nebenbei noch andere Scripte. Deswegen möchte ich ja von vornherein den Timeout beim Browser deaktivieren oder etwas ähnliches, das wirklich erst gewartet wird, bis das Java-Prog fertig ist.
Evtl. hilft der Link weiter http://fit.c2.com/wiki.cgi?PreventingBrowserTimeout
Struppi.
Jedoch gibt es jetzt schon wieder ein neues Prob. Dauert der Ablauf des Java-Programmes zu lang, kommt im Browser automatisch: Die Seite kann nicht angezeigt werden. Wie kann ich das unterbinden und die Seitenaktualisierung des Browsers wirklich abwartet, bis das Java-Programm fertig ist?
Indem du dem Server sagst, dass er länger warten soll bis ein Timeout erfolgt.
Struppi.
Jedoch gibt es jetzt schon wieder ein neues Prob. Dauert der Ablauf des Java-Programmes zu lang, kommt im Browser automatisch: Die Seite kann nicht angezeigt werden. Wie kann ich das unterbinden und die Seitenaktualisierung des Browsers wirklich abwartet, bis das Java-Programm fertig ist?
Indem du dem Server sagst, dass er länger warten soll bis ein Timeout erfolgt.
Struppi.
Hi struppi meinst du der PC hört auf ihn heheheheee ;-)
Wie kann ich das unterbinden und die Seitenaktualisierung des
Browsers wirklich abwartet, bis das Java-Programm fertig ist?
HTTP kennt den Statuscode "102 Processing"
http://de.wikipedia.org/wiki/HTTP#HTTP-Statuscodes
Wie du jetzt von deinem Java-Programm dem Server sagen kannst, er solle doch bitte dem Client einen 102er senden, weiß ich nicht.
Hallo erstmal!
HTTP kennt den Statuscode "102 Processing"
http://de.wikipedia.org/wiki/HTTP#HTTP-Statuscodes
weder IE 6 von Moz/FF kommen mit diesem Statuscode zurecht. Er gehört zur WebDAV-HTTP-Erweiterung (RFC 2518 Abs. 10.1)
Gruß aus Berlin!
eddi
Hallo erstmal!
HTTP kennt den Statuscode "102 Processing"
http://de.wikipedia.org/wiki/HTTP#HTTP-Statuscodes
weder IE 6 von Moz/FF kommen mit diesem Statuscode zurecht. Er gehört zur WebDAV-HTTP-Erweiterung (RFC 2518 Abs. 10.1)
Na klasse, das wäre wohl auch zu einfach gewesen :(
MFG
Torsten, auch aus Berlin