shell-script 'wget' Error bei timeout

Von: , Frage gestellt am Fr, 23. Mär 2007

Hi all!

Ich habe ein kleines shellscript dass via cronjob regelmäßig durchläuft.
in dem Script werden ganz simpel mit wget einige Seiten aufgerufen, die dann lokal gespeichert werden.
Sieht beispielsweise so aus (URL geändert):

date=`date '+%F'`
#Homepage - Events today - workshops (NewsindexTeaser)
URL1="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&..."
wget -O news1.xml "$URL1"


Funktioniert auch klasse. Er überschreibt bei jedem Durchlauf die file. Allerdings kam es in letzter Zeit leider vor, dass der Server auf dem die Seite aufgerufen wird down war.

wget versucht es dann standard mäßig 20mal

Beispiel output:
--11:10:11--  http://xxx.xxx.de/tools/export.py?fid=14&date=2007-0...
(try:12) => `news6.xml'
Connecting to xxx.xxx.de[xxx.xxx.5.58]:80... connected.
HTTP request sent, awaiting response...
Read error (Connection reset by peer) in headers.
Retrying.


Er bekommt 20x mal nen Read error und sagt dann "Giving up". Dann überschreibt er jedoch leider die file mit leerem Inhalt!

Ich suche eine unless-abfrage. Also irgendsowas am Anfang "unless output=ERROR"

so dass er das script nur durchläuft wenn der Server erreichbar ist. Wenn nicht soll er die files im alten Zustand lassen - besser alte Infos als gar keine Wink

Hoffe mir kann einer helfen!

Greeetz Basti

5 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: shell-script 'wget' Error bei timeout

    hi Basti

    1. wget in eine temporäre datei
    2. $ERR = `grep ERROR $temp | wc -l`
    3. if [ $ERR -eq 0 ] ...
    4. cp $temp $xml


    alles klar?

    lg
    erwin

    • Antwort von nach 3 Stunden 0 hilfreich
      Re^2: shell-script 'wget' Error bei timeout

      Hallo, 1. wget in eine temporäre datei
      2. $ERR = `grep ERROR $temp | wc -l`
      3. if [ $ERR -eq 0 ] ...
      4. cp $temp $xml
      wäre es nicht besser den Fehlercode (Errorlevel) von wget zu prüfen? Denn so darf die heruntergeladene Datei die Zeichenfolge ERROR nicht enthalten.

      Statt dem Variablen-Hin-und-Her kann man unter der Bash auch einfach ergebnisabhängige Befehlsausführung verwenden:

      Befehl1 && Befehl2

      Befehl2 wird nur ausgeführt, wenn Befehl1 keinen Fehler (d.i. Fehlercode = 0) liefert.

      --
      Philipp

      • Antwort von nach 4 Stunden 0 hilfreich
        Re^3: shell-script 'wget' Error bei timeout

        hi Philipp

        natürlich ist es besser, den fehlercode zu verwenden. fragt sich nur, ob wget immer einen fehlercode liefert. ich habe bei wget immer wieder das problem, dass der http-aufruf an sich funktioniert hat, der web-server aber müll geliefert hat. damit hätte wget keinen fehlercode geliefert. ich prüfe daher immer den inhalt der datei und ignoriere den fehlercode. nicht ganz sauber aber funktioniert.

        und ja, natürlich kann man den ganzen code auf eine zeile komprimieren. das verbessert aber die lesbarkeit des codes. und wenn man ein paar monte später vielleicht mal was ausbessern will, zahlt sich dass bisschen tipparbeit schon aus.

        lg
        erwin

        • Antwort von nach 5 Stunden 0 hilfreich
          Re^4: shell-script 'wget' Error bei timeout

          Hallo, natürlich ist es besser, den fehlercode zu verwenden. fragt
          sich nur, ob wget immer einen fehlercode liefert. ich habe bei
          wget immer wieder das problem, dass der http-aufruf an sich
          funktioniert hat, der web-server aber müll geliefert hat.
          damit hätte wget keinen fehlercode geliefert. ich prüfe daher
          immer den inhalt der datei und ignoriere den fehlercode.
          dann solltest du aber den Inhalt der Datei tatsächlich prüfen. Von einem Fehler auszugehen, wenn ein einziges Wort, das auch in der Fehlermeldung vorkommt, in der Ausgabe auftaucht, ist nicht sonderlich sinnvoll. nicht ganz sauber aber funktioniert.
          Dein Code würde tatsächlich nicht funktionieren, da im Fehlerfalle die heruntergeladene Datei i.d.R. schlicht leer sein wird (siehe entsprechenden Hinweis des OP), also auch kein ERROR enthalten wird. Es würden aber sehr wohl legitime Dateien verworfen, deren Download geklappt hat. und ja, natürlich kann man den ganzen code auf eine zeile
          komprimieren. das verbessert aber die lesbarkeit des codes.
          Die von mir vorgeschlagene Variante enthält sowenig Programm-Logik, dass sie durch eine einzige Zeile nicht übertrieben komprimiert ist.

          Eine bessere Prüfung, kann die Tipparbeit wert sein, aber dazu muss sie erstmal tatsächlich besser sein.

          --
          Philipp

    • Antwort von nach 4 Stunden 0 hilfreich
      Re^2: shell-script 'wget' Error bei timeout

      Danke, dein Ansatz war Hilfreich ;)
      So siehts nun aus:

      #!/bin/sh
      cd /afs/...
      date=`date '+%F'`
      #Connection check
      URL_check="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&..."
      wget -t 1 -O check.xml "$URL_check" -o check.log
      #Ausführen nur wenn kein 'ERROR' oder 'Giving up' in check.log gefunden wird
      err=`grep -i 'Giving up' check.log | wc -l`
      err2=`grep -i ERROR check.log | wc -l`
      if [ $err == 0 ] && [ $err2 == 0 ]; then
      #Homepage - Events today - workshops (NewsindexTeaser)
      URL1="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&..."
      wget -O news1.xml "$URL1"
      #Homepage - Events today - seminars (NewsindexTeaser)
      URL2="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&..."
      wget -O news2.xml "$URL2"
      #Homepage - Upcoming Seminars (NewsindexTeaser2)
      URL3="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&..."
      wget -O news3.xml "$URL3"
      ....
      fi
      
      [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!