PDA

Bekijk Volledige Versie : hulp voor 'n commando



Wynand
07/03/10, 20:03
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.
#

t.bloo
07/03/10, 21:24
#! /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".

Wynand
07/03/10, 21:26
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.

t.bloo
07/03/10, 22:05
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 )

Wynand
07/03/10, 22:29
#!/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

Mikey
07/03/10, 22:38
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
07/03/10, 22:45
@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.

Mikey
07/03/10, 22:48
#!/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 ;)

Wynand
07/03/10, 22:49
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. :)

Mikey
07/03/10, 22:55
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

Wynand
07/03/10, 22:56
thx :)

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)

Mikey
07/03/10, 22:57
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. :)