Bekijk Volledige Versie : hulp voor 'n commando
Hi,
Ik zou een commando moeten hebben om van een hele reeks files enkel de eerste deeltjes te willen downloaden. Say 5 MB van elke file, al is stoppen na 5 seconden is even goed.
Iets met
screen wget -r -c http://domain.ext/file1.zip > /dev/null \
http://domain.ext/file2.zip > /dev/null \
http://domain.ext/file3.zip > /dev/null
Iemand die weet hoe dit verder aan te vullen is?
systemdeveloper
07/03/10, 20:25
Het perlscriptje kun je gebruiken om elke x seconden (5 in dit geval) een bepaald process te killen, dat het zelf start. Het fivesec scriptje moet je even door je bestanden laten roteren o.i.d.
;;
;; timeddownload.pl
;;
#!/usr/local/bin/perl -W
my $runok = 0;
eval {
local $SIG{ALRM} = sub {
my $pid = '/bin/ps ax | /usr/bin/grep fivesecdownloadscript | /usr/bin/grep -v grep | /usr/bin/awk \'{print $1;}\'';
my $ret = `$pid`;
if ( $ret > 0 ) {
print "Killing PID: $ret\n";
$cmd = "/bin/kill -9 $ret";
system($cmd);
}
die "alarm clock restart" ;
};
alarm 5;
system("/bin/sh ./fivesecdownloadscript.sh");
$runok = 1;
};
if ($runok and $@ !~ /alarm clock restart/) {
print "# process completed within 5 secs\n";
} else {
print "# process killed after 5 secs\n"
}
----------------------------
;;
;; fivesecdownloadscript
;;
#!/bin/sh
wget -r -c http://domain.ext/file1.zip
#
# uit te breiden met een 'shift' of if [ -x ] om te controleren of het volgende bestand gedownload moet worden.
#
#! /usr/local/bin/php
<?php
$length = 5 * 1024 * 1024;
$urls = array(
'http://www.webhostingtalk.nl',
'http://www.dommelhosting.nl',
);
foreach ($urls as $url)
{
$bytes = file_get_contents($url, 0, NULL, 0, $length);
echo $url.': '.strlen($bytes)."\n";
}
?>
Kun je aanroepen met "php bestandsnaam.php" of na chmod +x met "./bestandsnaam.php".
t.bloo: zou via wget moeten gaan, of alleszins nog een cookie voor moeten ingeladen worden. Ben ondertussen zelf wat met bash aan het spelen, t perlscriptje gaat me nog wat ver.
systemdeveloper
07/03/10, 21:44
Het perlding is alleen om de timelimit af te dwingen. Of je dan een wget, fetch of t.bloo's manier van downloaden gebruikt is niet spannend. Voor het koekje kun je eens naar curl kijken als je bij php wilt blijven.
Kun je wellicht iets met
wget --read-timeout=5 --tries=1 www.webhostingtalk.nl
systemdeveloper
07/03/10, 22:12
Kun je wellicht iets met
wget --read-timeout=5 --tries=1 www.webhostingtalk.nl
wget www.webhostingtalk.nl (http://www.webhostingtalk.nl) &;sleep 5;killall -9 wget
Hehe, korter en minder saai.... (sry, kiddi'n, als ik kudos had kreeg je ze voor de meest stabiele en user-friendly oplossing :D )
#!/bin/bash
FNL="http://domain.ext/file1.zip
http://domain.ext/file2.zip
http://domain.ext/file3.zip"
LOO=(1)
for FN in $FNL; do
echo "$FN"
wget --limit-rate=100k --load-cookies ~/.cookies/cookiez $FN -O /dev/null &
sleep 5
killall -15 wget
echo ""
done
exit
wget www.webhostingtalk.nl (http://www.webhostingtalk.nl) &;sleep 5;killall -9 wget
)
Moet zijn:
wget www.webhostingtalk.nl (http://www.webhostingtalk.nl) & sleep 5;killall -9 wget
Nadeel aan bovenstaand is dat je alle wget processen killed...
Zet onderstaand in een bash script
wget -N -q <url> & pid=$!
sleep 5
kill -9 $pid
systemdeveloper
07/03/10, 22:43
@Mikey: Moet toch met ';' zijn. wget moet toch op achtergrond draaien anders wordt de sleep pas ná de wget uitgevoerd. Kinda pointless dan, toch?
@Mikey: Moet toch met ';' zijn. wget moet toch op achtergrond draaien anders wordt de sleep pas ná de wget uitgevoerd. Kinda pointless dan, toch?
Hier niet:
wget www.webhostingtalk.nl &;sleep 5;killall -9 wget
-bash: syntax error near unexpected token `;'
De & geeft al aan dat er een nieuw command opgevoerd kan worden, een ; daarachter is hier niet nodig en werkt niet eens.
#!/bin/bash
FNL="http://domain.ext/file1.zip
http://domain.ext/file2.zip
http://domain.ext/file3.zip"
LOO=(1)
for FN in $FNL; do
echo "$FN"
wget --limit-rate=100k --load-cookies ~/.cookies/cookiez $FN -O /dev/null &
sleep 5
killall -15 wget
echo ""
done
exit
Vul deze aan met het stukje waarmee ik de PID vang en je hebt de mooiste oplossing. Server of user wide wget killen is nou niet echt de meest mooie oplossing ;)
Dat niet, maar er werkt verder niemand op dus mag ik wel hopen dat ik van mezelf weet dat ik ergens anders nog wat aan het afhalen ben. :)
Dat niet, maar er werkt verder niemand op dus mag ik wel hopen dat ik van mezelf weet dat ik ergens anders nog wat aan het afhalen ben. :)
Ik blijf erbij ;)
#!/bin/bash
FNL="http://domain.ext/file1.zip
http://domain.ext/file2.zip
http://domain.ext/file3.zip"
LOO=(1)
for FN in $FNL; do
echo "$FN"
wget -N -q --limit-rate=100k --load-cookies ~/.cookies/cookiez $FN -O /dev/null & pid=$!
sleep 3
kill -9 $pid
echo ""
done
exit
systemdeveloper
07/03/10, 22:56
Vul deze aan met het stukje waarmee ik de PID vang en je hebt de mooiste oplossing. Server of user wide wget killen is nou niet echt de meest mooie oplossing ;)
Aha, is freebsd :)
$ wget www.webhostingtalk.nl (http://www.webhostingtalk.nl) &;sleep 5;killall -9 wget
[1] 46540
--22:55:34-- http://www.webhostingtalk.nl/
=> `index.html'
Resolving www.webhostingtalk.nl (http://www.webhostingtalk.nl)... done.
Connecting to www.webhostingtalk.nl (http://www.webhostingtalk.nl)[213.136.19.171]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
[ <=> ] 133,253 3.03M/s
22:55:35 (3.03 MB/s) - `index.html' saved [133253]
No matching processes were found
[1] + Done wget www.webhostingtalk.nl (http://www.webhostingtalk.nl)
denk het voor centos is na de & het eerste commando ; , en dat kent hij niet ;)
systemdeveloper
07/03/10, 23:04
denk het voor centos is na de & het eerste commando ; , en dat kent hij niet ;)
Weet je, ik gebruik eigenlijk alleen dat perl scriptje als ik iets timelimited nodig heb en de rest heb ik niet eens getest omdat ik vrijwel nooit een goede reden heb om een process halverwege te killen tenzij het fout loopt. :)