Barna: LWP::UserAgent und Timeout

Hi All

Ich habe ein Perl Script das ziemlich oft mit LWP::UserAgent auf eine Seite zugreift (dessen Server leider ziemlich unstabil ist).
Nun ist es eben sehr oft der Fall das die seite Crashed und nix mehr erreichbar ist. Server anPingen geht zwar noch wunderbar aber Seite empfangen geht nicht mehr.
Wenn ich nun nach so nem Crash mit dem Script drauf zugreife, braucht der UserAgent ca 30-60 Sekunden bis er den Error erkennt, und ich ihn auswerten kann (und dann schreiben, blabla ist ausgefallen...)
Auch die TimeOut Einstellung beim UA wollte nichts nützen, aber er braucht ja auch nicht die standardeinstellung von 180Sek bis er den Fehler erkennt.
Nun suche ich eine andere möglichkeit mit der ich vor dem ersten UserAgent einsatz den Server prüfen kann, damit ich schneller weiss ob der Server nun will oder nicht.

Danke!!!

  1. Hi,

    Nun suche ich eine andere möglichkeit mit der ich vor dem ersten UserAgent einsatz den Server prüfen kann, damit ich schneller weiss ob der Server nun will oder nicht.

    so direkt fällt mir leider keine ein, aber vielleicht kannst Du mit LWP::Parallel ja "workarounden". Es wundert mich aber doch, daß $ua->timeout() nicht funktionieren soll... könnte es ein Codefehler sein?

    Cheatah

    1. so direkt fällt mir leider keine ein, aber vielleicht kannst Du mit LWP::Parallel ja "workarounden". Es wundert mich aber doch, daß $ua->timeout() nicht funktionieren soll... könnte es ein Codefehler sein?

      Hi

      Mit Parallel hab ich grad angefangen, aber bringen tut das auch nichts, so wie's aussieht macht parallel halt einfach mehrere User agents gleichzeitig (oder nacheinander?) durch, was wieder gleich lang geht...
      Mit dem Timeout weiss ich auch ned warum... aber ob ich jetzt $ua->timeout(10) oder $ua->timeout(10000) mache, es geht gleich lang... Ich bin auch schon mit dem PerlDebugger bis in die unendlichkeit des UserAgent vorgedrungen... er hat zwar immer die Timeoutvariable auf dem gewünschten wert gehalten, aber eingehalten hat er sie nicht...

      Danke trotzdem

      Barna

      1. Mit dem Timeout weiss ich auch ned warum... aber ob ich jetzt $ua->timeout(10) oder $ua->timeout(10000) mache, es geht gleich lang... Ich bin auch schon mit dem PerlDebugger bis in die unendlichkeit des UserAgent vorgedrungen... er hat zwar immer die Timeoutvariable auf dem gewünschten wert gehalten, aber eingehalten hat er sie nicht...

        Hast Du mal ein strace probiert? Dann poste das Ergebnis.

        Peter

        1. Hast Du mal ein strace probiert? Dann poste das Ergebnis.

          Hi

          Meinst du ein normaler netzwerk Trace, oder strace (so ein debugprogramm das prozessübergreifendes kommandos ausgiebt)?
          Mit einem netzwerk Trace gehts so erfolgreich wie ein Ping während dem der Server down ist...

          *nichtsweiss*

          Danke!!

          1. Meinst du ein normaler netzwerk Trace, oder strace (so ein debugprogramm das prozessübergreifendes kommandos ausgiebt)?
            Mit einem netzwerk Trace gehts so erfolgreich wie ein Ping während dem der Server down ist...

            Ich meinte strace, nicht traceroute oder ping.

            Peter

    2. so direkt fällt mir leider keine ein, aber vielleicht kannst Du mit LWP::Parallel ja "workarounden". Es wundert mich aber doch, daß $ua->timeout() nicht funktionieren soll... könnte es ein Codefehler sein?

      Ich habe einmal erlebt, dass der Timeout nicht funktionierte, weil die Installation fehlerhaft war. Das sollte man aber mit einem strace herausfinden koennen.

      Peter

  2. Hi,

    in LWP befindet sich in den Versionen vor 5.18
    ein conflicting bug, derart, dass das timeout-Objekt
    mit Hilfe von alarmen gesteuert wird.

    In Perl kann aber nur ein einziger Alarmsignal
    zur Zeit verwendet werden.
    Genauer:

    lwp setzt timeout-Wert im alarm() auf 10.

    Im Programm ruft aber irgendein anderes Modul oder
    ein Auruf alarm() nochmal auf. Wenn es nach dem LWP-Aufruf
    erfolgt: alarm() wird mit den neuen Aufruf initialisiert.
    Ausserdem wird das SIGNAL-Call auf eine andere Funktion gestellt
    und nicht die vom LWP.

    Ergo:
    Wenn du eine version von LWP aelter als 5.18 hast
    und IO aelter als 1.20 solltest du beide updaten.

    In den neuen Versionen von LWP wird nicht mehr mittels
    des alarm()-Befehles der Timeout gemacht.
    IO solltest du aus demselben grund updaten.

    Ciao,
      Wolfgang