Schleife zu groß
Reiner Rusch
- perl
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
wie wäre es denn mit zwei Schleifen, die jeweils 500 mal laufen?
Cruz
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
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
Haeh? Wieso sollten zweimal 500 Durchlaeufe schneller sein als einmal tausend?
»
Haeh? Und wer sagte, daß sie schneller sein sollten?
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
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
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
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
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.
Der Admin weiß - glaube ich- selbst nicht, was geht und was nicht geht....
Reiner
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
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
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.
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
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
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.