Reiner Rusch: Schleife zu groß

Wenn ich bei meinem Provider eine Schleife:

for ($t=1; $t<10000; $t++)
{
   tue was;
}

ablege, kommt ein Fehler! Ich weiß natürlich auch warum:
Die Schleife ist zu groß! Wenn Sie 1000 Iterationen überschreitet, nimmt der Server wohl an, die Abbruchbedingung ist nicht in Ordnung, und gibt das Script als fehlerhaft an.
Wenn ich nunmal aber soviele durchläufe brauche, ist das ein Problem. Wie würdet Ihr das lösen? Vielleicht mit script.cgi?parameter das Script neu aufrufen????

Alles Gute,
Reiner

  1. wie wäre es denn mit zwei Schleifen, die jeweils 500 mal laufen?

    Cruz

    1. Danke,
      ich bin heute nicht so fit!!!
      Das einfache ist manchmal so nahe...

      Machs gut,
      Reiner

      wie wäre es denn mit zwei Schleifen, die jeweils 500 mal laufen?

      Cruz

    2. Auch Hallo!

      Die Schleife ist zu groß! Wenn Sie 1000 Iterationen überschreitet, nimmt der Server wohl an, die Abbruchbedingung ist nicht in Ordnung, und gibt das Script als fehlerhaft an.

      Der Server nimmt ueberhaupt nichts an. Er fuehrt das Script einfach aus, und er gibt ihm eine gewisse Zeit, um fertig zu werden. CGI-Timeout heisst das wohl. Ist es nicht rechtzeitig fertig, oder druckt der Surfer am anderen Ende der leitung auf den Stop-Button, wird das Script abgebrochen.

      wie wäre es denn mit zwei Schleifen, die jeweils 500 mal laufen?

      Haeh? Wieso sollten zweimal 500 Durchlaeufe schneller sein als einmal tausend?

      Um das CGI-Timeout zu umgehen, kannst Du den Prozess spalten und einen Teil abkoppeln. Erik Tews hat dazu vor einiger Zeit mal was geschrieben: <../../sfarchiv/1999_2/t03884.htm#a18765>.

      Calocybe

      1. Haeh? Wieso sollten zweimal 500 Durchlaeufe schneller sein als einmal tausend?

        »

        Haeh? Und wer sagte, daß sie schneller sein sollten?

        1. Haeh? Wieso sollten zweimal 500 Durchlaeufe schneller sein als einmal tausend?

          »

          Haeh? Und wer sagte, daß sie schneller sein sollten?

          Das hat Calocybe mit seinem Wissen vermischt:
          Ich war davon ausgegangen, daß es an der Anzahl der Iterationen liegt, es liegt aber an der Zeit, die das Script braucht. Dann kommt es zum Time-Out. Deswegen wäre die Lösung, weniger Zeit zu brauchen, was Calocybe meinte....

          Alles Gute,
          Reiner

      2. Hallo Calocybe,

        suuuuper!!! Danke!
        Das wußte ich wirklich nicht!
        Ich habe bisher nur auf (sehr großen) Servern von Siemens gearbeitet, die hatten solche Probleme nicht. Der Text ist ein Volltreffer, da ich auch bei Schlund bin..vielleicht ein Fehler?
        Weiß nicht! Wird besprochen!!!

        Danke sehr!

        Alles Gute,
        Reiner

      3. Um das CGI-Timeout zu umgehen, kannst Du den Prozess spalten und einen Teil abkoppeln. Erik Tews hat dazu vor einiger Zeit mal was geschrieben: <../../sfarchiv/1999_2/t03884.htm#a18765>.

        Der Ansatz von Erik ist genial!
        Was dieser Bogus da schreibt, ist vielleicht richtig, aber auch sehr mit Emotionen verbunden. Man kann ja auch nicht alle naselang die Firma wechseln, oder?
        Ansonsten hat das ja wohl auch immer eine Grenze, ob nun nach 12 Sek. oder einem Tag.
        Sehe ich das richtig?
        Mir fällt allerdings auch auf, daß man bei Schlund nach jedem Scheiß nachfragen muß. Die Supportseiten sind für absolute Anfänger gedacht, denn ich weiß, was FTP ist!  :-)
        Ich habe z.B. Druck gemacht, daß sie die GD-Bibliothek einbinden. Da das mehrere verlangten, war es kein Problem. Aber die stellen sich ziemlich an. Ich kann auch nicht verstehen, daß man erst im Profi-Tarif Telnet-Zugang bekommt. Wo ist das Problem dabei????

        Reiner

      4. Das dürfte für alle interessant sein:

        Guten Tag Herr Rusch,

        ich glaube nicht, dass es durch einen 2. Prozess moeglich ist, unsere
        CPU-Zeitbegrenzung von 6 Sekunden fuer CGIs zu umgehen. Evtl. gibt es
        aber doch einen Trick.

        Bitte haben Sie jedoch Verstaendnis, dass wir ueberlange Prozesse, die
        die Verfuegbarkeit unserer Server beeintraechigen, ohne Vorwarung beenden.

        Mit freundlichen Grüßen
        Uwe Feik

        Technischer Support
        Schlund + Partner AG
        mailto:support@schlund.de

        Bitte geben Sie immer Ihre Kundennummer der Service-Card an.

        Traumauto gesucht, und schon gefunden - http://webauto.de

        1. Das dürfte für alle interessant sein:

          Guten Tag Herr Rusch,

          ich glaube nicht, dass es durch einen 2. Prozess moeglich ist, unsere
          CPU-Zeitbegrenzung von 6 Sekunden fuer CGIs zu umgehen. Evtl. gibt es
          aber doch einen Trick.

          Der Code funzt zumindest mit den meisten Unixen. Ich kenne keinen Webserver, der nach den 6 Sekunden noch den 2. Prozess beendet.

          Bitte haben Sie jedoch Verstaendnis, dass wir ueberlange Prozesse, die
          die Verfuegbarkeit unserer Server beeintraechigen, ohne Vorwarung beenden.

          Hm, da fällt mir ein, es gibt auch ne Möglichkeit, zu verhinder, daß jemand ein Programm unter Unix mit STRG+C beendet. Ist auch relativ einfach.

          1. Der Admin weiß - glaube ich- selbst nicht, was geht und was nicht geht....

            Reiner

          2. Hallo Eric.

            Hm, da fällt mir ein, es gibt auch ne Möglichkeit, zu verhinder, daß jemand ein Programm unter Unix mit STRG+C beendet. Ist auch relativ einfach.

            SIGTERM ( kill -15) abzufangen ist einfach, SIGKILL (kill -9) schon schwerer und unter Perl auch IMHO nicht möglich. Ausserdem, würdest Du als Provider Dich mit  mit einer unsicheren, aber anständigen Methode zufrieden geben, wenn es auch eine sichere, wenn auch brutale, gibt ?
            Irgendwo im Netz gibt es eine kleine Geschichte namens " The Bastard Operator Of Hell"(die Adresse habe ich leider verschlampt, sorry) die zwar satirisch überspitzt ist, aber ich wette, der eine oder andere wird seinen Sysop/Sysadmin wenigstens in einigen Teilen wiedererkennen. Ich selbst als Sysadmin schließe mich nicht davon aus ;-)

            Ach, übrigens, mit "6 Sek" kann auch die reine, Nettoprozessorzeit gemeint sein, dann wäre es eigentlich völlig ausreichend, für ca 2 Mio. einfachste Iterrationen, in diesem Fall:Lesen der Startposition, Dekrement von 1, speichern. Dies auf einem alten P200.
            Den Prozess nur 6 sek lang am Stück im Speicher zu belassen, das andere Extrem, ist unverschämt (s.o. BOoH), ich würde in dem Fall ernsthaft erwägen den Provider zu wechseln.
            Gruss
            Christoph

            1. Den Prozess nur 6 sek lang am Stück im Speicher zu belassen, das andere Extrem, ist unverschämt (s.o. BOoH), ich würde in dem Fall ernsthaft erwägen den Provider zu wechseln.

              Erstmal abwarten!
              Aber eine Frage habe ich doch noch:

              Gehen wir mal davon aus, der Trick mit dem FORK klappt. Was passiert, wenn man in dem Teil unbewußt einen Fehler macht (z.B. Schleife, die niemals endet). Wird der Prozeß dann irgendwann vom Server gekillt...oder läuft der bis 2015, wenn der Rechner nicht neu gebootet wird???

              Reiner

              1. Den Prozess nur 6 sek lang am Stück im Speicher zu belassen, das andere Extrem, ist unverschämt (s.o. BOoH), ich würde in dem Fall ernsthaft erwägen den Provider zu wechseln.

                Erstmal abwarten!
                Aber eine Frage habe ich doch noch:

                Gehen wir mal davon aus, der Trick mit dem FORK klappt. Was passiert, wenn man in dem Teil unbewußt einen Fehler macht (z.B. Schleife, die niemals endet). Wird der Prozeß dann irgendwann vom Server gekillt...oder läuft der bis 2015, wenn der Rechner nicht neu gebootet wird???

                Der läuft dann bis zum nächsten Reboot. Du kannst aber einen Mechanismus programmieren, der den Prozeß sagen wir mal so nach 5 Minuten killt.

                1. Hallo Eric,

                  Der läuft dann bis zum nächsten Reboot. Du kannst aber einen Mechanismus programmieren, der den Prozeß sagen wir mal so nach 5 Minuten killt.

                  Wie? Über eine Art Timeout? Das könnte aber auch in die Hose gehen! Ich persöhnlich würde in diesem speziellem Fall (Schleifen, deren Abruchbedingungen evt. nie eintreffen, vulgo endlos laufen) einmal grob abschätzen, wie oft diese Schleife maximal durchlaufen werden , "Worst Case", und einfach einen Zähler einbauen. Ein Timeout kann nämlich auch zuschlagen, zumindest wenn er sich auf die Systemzeit bezieht, wenn dem Prozess 1. nur eine niedrige Priorität zugebilligt wurde + 2. sehr viel "Verkehr" auf dem Prozessor ist + 3. das Time out recht knapp gewählt wurde, um nicht aufzufallen (manche Sysadmins begrenzen bei _allen_  Prozessen die Prozessorzeit, ausser den lebensnotwendigen wie Kernel, Init, Webserver und nur ein paar mehr auf eine Stunde oder weniger (manche dieser "fachischtischen" Sysadmins sind so blöd, dass sie glauben, den Kernel und Init extra ausnehmen zu müssen ;-) selber erlebt!) ).
                  Ich sage das deshalb, weil ich selbst bei einem mir einmal bekannt gewesenem (ich mag ihn jetzt nicht mehr kennen ;-) Sysadmin erlebt habe, dass dieser jeden Abend kurz vor Feierabend und jeden Morgen bei Dienstbeginn sich ein top ausdrucken ließ  und jedem Prozess der nicht von ihm, oder lebensnotwendig war gnadenlos mit kill -9 beendete, egal, ob das irgendwelche Rechenintensive Arbeiten a la Rendering oder eine finite Elemente Berechnung für eine Diplomarbeit ( Abgabe Gestern) war.
                  Und dieser Knabe arbeitet jetzt in dieser Position bei einem großen ISP, dessen Namen ich verständlicherweise nicht nennen kann.
                  Man kann nur hoffen, dass diese Leute weiterhin mit den Fingern essen ;-)
                  viele Grüße
                  Christoph

          3. Hm, da fällt mir ein, es gibt auch ne Möglichkeit, zu verhinder, daß jemand ein Programm unter Unix mit STRG+C beendet. Ist auch relativ einfach.

            Würde mich auch interessieren!
            Du scheinst echt fit zu sein!  :-)

            Danke!

            Reiner

      5. Um das CGI-Timeout zu umgehen, kannst Du den Prozess spalten und einen Teil abkoppeln. Erik Tews hat dazu vor einiger Zeit mal was geschrieben: <../../sfarchiv/1999_2/t03884.htm#a18765>.

        Ja, der Trick funzt heute immer noch. Aber noch mal meine Bitte: Keine Endlosschleife programmieren. Sonst wundert sich irgendwann mal ein armer Sysadmin, was da für komische Prozesse schon seit ein paar Tagen laufen, und den Server langsam machen.

        Wenn noch wer Fragen zu dem Code hat, kann er sie ja mal hier schicken. Ich arbeite immer noch mit diesem Code.