Torsten: Kein Timeout im Browser

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

  1. 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?

    1. 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

      1. 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

        1. 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

          1. Hier ein handbuch.

            http://www.cisco.com/en/US/products/sw/secursw/ps5318/products_user_guide_chapter09186a0080556a7b.html

            viel glück :-)

            1. 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

              1. 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

                1. 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=9

                  ein 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

                  --
                  Wer Rechtschreibfehler findet, darf sie behalten.
                  1. 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

                    1. 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

                      --
                      Wer Rechtschreibfehler findet, darf sie behalten.
                      1. 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

                        1. 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

                          1. Ab hier Prozesssteuererung mittels fork()

                            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

                            1. 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

                              1. 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.

                                1. 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

                                  1. 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.

                                    1. 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

                                      1. 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/";

                                        schon hier Prozesssteuerung mittels fork()

                                        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();
                                        }

                                        fehlt nur noch der Teil für den Kind-Prozess

                                        exit;

                                        MFG
                                        Torsten

                                        1. 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

                                          1. 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 ;)

                                            8:34

                                            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...)

                                            9:08

                                            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.

                                            9:29

                                            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)

                                            10:11

                                            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.

                                            13:19

                                            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

                                            --
                                            Wer Rechtschreibfehler findet, darf sie behalten.
          2. 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.

  2. 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.

    1. 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 ;-)

  3. 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.

    1. 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

      --
      Wer Rechtschreibfehler findet, darf sie behalten.
      1. 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