Shell-script 'wget' Error bei timeout

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&days=1&event=conference&of=xml"
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-03-21&days=365&event=conference&of=xml
 (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

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

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

Danke, dein Ansatz war Hilfreich :wink:
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&days=1&event=conference&of=xml"
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&days=1&event=conference&of=xml"
 wget -O news1.xml "$URL1"

 #Homepage - Events today - seminars (NewsindexTeaser)
 URL2="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&days=1&event=simple\_event&of=xml"
 wget -O news2.xml "$URL2"

 #Homepage - Upcoming Seminars (NewsindexTeaser2)
 URL3="http://xxx.xxx.de/tools/export.py?fid=14&date=$date&days=12&event=simple\_event&of=xml"
 wget -O news3.xml "$URL3"

....

fi

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

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

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