wget letöltő script hiba

 ( _Petya_ | 2006. március 27., hétfő - 18:52 )

Üdvözlet!

A követekző scriptet követtem el:

!/bin/bash
dir=$1_`date +%y%m%d`
dirt=$1_tmp
name=$1_`date +%y%m%d%H%M`

if test ! -d $dir
then
mkdir $dir
fi
if test ! -d $dirt
then
mkdir $dirt
fi
filenev=`echo $2 | awk -F/ '{print $NF}'`
ext=`echo $filenev | awk -F. '{print $2}'`
cd $dirt
rm -f wget.log
wget -N -o wget.log $2
cd ..
if [ ! "`cat $dirt/wget.log | grep szerver|awk {'print $2'}`" == "szerveren" ];
then
if [ "`diff -s $dirt/saved.$ext $dirt/$filenev 2>/dev/null| awk {'print $1'}`" == "Files" ];
then
echo
echo $1 : feleslegesen mentettunk, ez nem kell
else
echo
echo $name : nincs meg, mentjuk
cp $dirt/$filenev $dir/$name.$ext
rm -f $dirt/saved.$ext
ln $dir/$name.$ext $dirt/saved.$ext
fi
else
echo -n .
fi

ezt az alábbi scriptből hívom:

#!/bin/bash
while true; do
./download.sh pmapN http://www.sel.noaa.gov/pmap/gif/pmapN.gif
./download.sh pmapS http://www.sel.noaa.gov/pmap/gif/pmapS.gif
./download.sh mtsatJP http://weather.is.kochi-u.ac.jp/QL/00Latest.jpg
./download.sh eit_171 http://sohowww.nascom.nasa.gov/data/realtime/eit_171/1024/latest.gif
./download.sh eit_195 http://sohowww.nascom.nasa.gov/data/realtime/eit_195/1024/latest.gif
./download.sh eit_284 http://sohowww.nascom.nasa.gov/data/realtime/eit_284/1024/latest.gif
./download.sh eit_304 http://sohowww.nascom.nasa.gov/data/realtime/eit_304/1024/latest.gif
./download.sh mdi_igr http://sohowww.nascom.nasa.gov/data/realtime/mdi_igr/1024/latest.gif
./download.sh mdi_mag http://sohowww.nascom.nasa.gov/data/realtime/mdi_mag/1024/latest.gif
./download.sh c2 http://sohowww.nascom.nasa.gov/data/realtime/c2/1024/latest.gif
./download.sh c3 http://sohowww.nascom.nasa.gov/data/realtime/c3/1024/latest.gif
./download.sh meteo http://iris.elte.hu/meteosat/640_ir_48.mpg
./download.sh iacw http://www.iac.es/weather/movie/d1d2.mpg
done

A cél az url-eken lévő képek mentése folyamatosan. A probléma pedig az, hogy bizonyos esetekben a wget akkor is lementi a képet, ha az nem frissült. Hogyan lehet ezt kiküszöbölni? (maga a script jól működik, hiszen nem tárolja el a feleslegesen letöltött képet, de ez így csúnya, szebb megoldást keresek rá) Tudtok segíteni? Köszönöm előre is!

Petya

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Cafoljatok, ha tevedek, de amig szukseged van a "-N" kapcsolora, addig nem biztos, hogy sikerul megoldanod ezt a problemat a wget-el.
Idezet a wget man-jabol:
"When running Wget with -r, but without -N or -nc, re-downloading a
file will result in the new copy simply overwriting the old."

Yndy

Az -N kapcsolóra csak a hálózati forgalom minimalizásása érdekében van szükség. Anélkül persze, működik, csak rettenetesen leterheli a netkapcsolatot, a többi gépről nem lehet dolgozni...

allitsal be savszelesseg korlatozast tc-vel
---------------------
Ригидус а бетегадьбол

Nem a sávszélesség az elsődleges gond, hanem az, hogy feleslegesen töltünk le. Ha a wget erre nem alkalmas, tud valaki javasolni jobbat?

Petya

Felhoznám a témát, talán ilyenkor többen nézitek az oldalt.

Petya

Wget helyett inkább javaslom a php-t:

function get_raw_header($host,$doc)
{
$httpheader = '';
$fp = fsockopen ($host, 80, $errno, $errstr, 30);
if (!$fp)
{
echo $errstr.' ('.$errno.')';
}else{
fputs($fp, 'GET '.$doc.' HTTP/1.0'."\r\n".'Host: '.$host."\r\n\r\n");
while(!feof($fp))
{
$httpresult = fgets ($fp,1024);
$httpheader = $httpheader.$httpresult;
if (ereg("^\r\n",$httpresult))
break;
}
fclose ($fp);
}
return $httpheader;
}

function get_header_array($url)
{
$url = ereg_replace('http://','',$url);
$endHostPos = strpos($url,'/');
if(!$endHostPos) $endHostPos = strlen($url);
$host = substr($url,0,$endHostPos);
$doc = substr($url,$endHostPos,strlen($url)-$endHostPos);
if($doc == '') $doc = '/';
$raw = get_raw_header($host,$doc);
$tmpArray = explode("\n",$raw);
for ($i=0;$i {
@list($name, $value) = explode(':', $tmpArray[$i], 2);
$array[trim($name)]=trim($value);
}
return $array;
}

$remote_file = 'http://valami.com/fajlneve.kit';

$array = get_header_array($remote_file);
echo '

'.$remote_file.' utoljára módosítva: '.date('j F Y',strtotime($array['Last-Modified'])).'

';

?>

Ezzel megkapod az utolsó módosítás idejét. Meg kell még írni az if ciklust a lekezelésre, de remlélem, kiindulásnak jó lesz.

Nos, a php-hez nem nagyon értek, így nem tudom, hogy lehet ezt összehozni egy shellscripttel. Leírnád röviden?

Petya

cURL?

A curl-nek nem találtam olyan opcióját, ami ugyanazt csinálná. mint a wget -N. Közben arra gondoltam, hogy a szerveroldalon lehet valami gond, lehet, hogy ott változik meg a timestamp. Ezt hogy lehet ellenőrizni, kiszűrni? Sniffeljem le a forgalmat?

Petya

Ismét felhoznám a témát. Újabb problémá merült fel:
1. Ha megszakad a netkapcsolat, akkor amíg nem áll helyre, áll a script, ez problémát okozhat. Van megoldás?

2. a fenti while true ciklus miatt túl gyakran vizsgál egy adott url-t, nincs szükség erre. Elég lenne percenként ránézni. 2 ötletem van: egyik a script végére beszúrni egy sleep-et, a másik pedig, az egészet cron-ból futtatni. Ha megszakad a kapcsolat, a sleep-es megoldásnál csak a következő kép kap rossz dátumot/időt, ha jól gondolom? Na de mi történik, ha cron-ból futtatom? Mi van, ha egyszerre több példányban fut a script? Ebben tudnátok segíteni?

Petya