Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Gaara в May 20, 2007, 23:08



Титла: Perl download script и status bar
Публикувано от: Gaara в May 20, 2007, 23:08
Здравейте,
искам да попитам дали някой знае, как може да се направи статус на свалящата се информация, т.е. моят нет е бърз и при свалянето на даден файл, нямам  забавяне, но ако нета е бавен?
Ето и примера, който се опитвам да модифицирам
Примерен код

#!/usr/bin/perl -w
use LWP::Simple;
print "Downloading bg_nets.txt, please wait ...\n";
my $url = "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=";
my $file="bg_nets.txt";
my $response = getstore($url, $file);


Идеята ми е по време на свалянето, да изписва нещо от сорта на
50%[***********                           ]
или някаква друга индикация.

Благодаря предварително.


Титла: Perl download script и status bar
Публикувано от: PERMANENT в May 21, 2007, 11:31
Да ти кажа да се работи с модулите на перл не е лесто защото все нещо им куца и трудно се съчетават помежду си.Та по същество... може да ползваш функцията head($url) от модула LWP::Simple за да видиш колко е голям фаила които сваляш след това може да отделиш един дъщерен процес които периодично да проверява колко е голям фаила $file и да изписва каква част се е дръпнала.За да се получи такъв ефект не забравяи че stdout-а на дъщерния процес трябва да е насочен към същия терминал които ползва и главния процесл.Имам някакви бледи спомени че една програма не перл не може да отваря един и същи фаил няколко пъти но ако го правиш в различни процеси предполатам че няма да има проблеми.М/у другото пробваи да направиш нещо от този род

while(getstore($url, $file)){
print '*';
}

може и да стане нещо но малко ме съмнява че ще се получи този ефект :)


Титла: Perl download script и status bar
Публикувано от: Gaara в May 21, 2007, 21:51
Цитат (PERMANENT @ Май 21 2007,12:31)
Та по същество... може да ползваш функцията head($url) от модула LWP::Simple за да видиш колко е голям фаила които сваляш след това може да отделиш един дъщерен процес които периодично да проверява колко е голям фаила $file и да изписва каква част се е дръпнала.За да се получи такъв ефект не забравяи че stdout-а на дъщерния процес трябва да е насочен към същия терминал които ползва и главния процесл.

Благодаря за отговора, но с цикъла нищо не стана :'(
Може ли малко инфо да ми препоръчаш, за извадката от отговора ти?
Реших, че ако не открия подходяш вариант, то този процес ще го вкарам във фонов режим. Така няма да държи конзолата и никой няма да разбере за свалянето, стига само да не е с модем  :D


Титла: Perl download script и status bar
Публикувано от: VladSun в May 21, 2007, 22:37
Ако целта ти е само това то:

Примерен код

#!/usr/bin/perl

print "Getting file... Please, wait ...\n";

`wget "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=" -O bg_nets.txt`;

print "Done! \n";



;) :)





Титла: Perl download script и status bar
Публикувано от: PERMANENT в May 22, 2007, 10:38
с wget също става :)
Примерен код
#!/usr/bin/perl
use LWP::Simple;
$url='';
$file='';
$file_size=(head($url))[1];
getstore($url,$file);
if(fork()){
$SIG{CHLD}='IGNORE';
while((-s $file)<=$file_size){
#тука правиш някъкви математиески изчисления и принтираш резултата
sleep 1;
}
}

може да има синтактични грешки не съм тествал да ли работи но като цяло това исках да ти предложа


Титла: Perl download script и status bar
Публикувано от: Gaara в May 22, 2007, 23:36
Да, с wget става също и за него се бях сетил в самото начало, но ми беше интересно дали може и в пърл. Много благодаря за помоща. Имам почти незначителен напредък, т.е.
Примерен код

#!/usr/bin/perl
use strict;
use warnings;
use Term::ProgressBar;
use LWP::Simple;
use File::stat;
my $file="bg_nets.txt";
my $url = "http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=";
getstore($url,$file);
my $filesize = stat("bg_nets.txt")->size;
my $progress = Term::ProgressBar->new({count =>$filesize, name=>"Downloading"});
my $j=0;
while($j<=(stat("bg_nets.txt")->size)) {
my $is_power = 0;
for(my $i = 0; 2**$i <= $j; $i++) {
$is_power = 1
if 2**$i == $j;
}
$progress->update($j);
$j++;
}

Файла първо се сваля, след това му се взима големината и чак тогава влиза в цикъла и почват процентите. Мисля, че за толкова малък файл, това ще е достъчно, но ще се  радвам на всяка друга насока от ваша страна :)

Всичко най-свежо от мен.


Титла: Perl download script и status bar
Публикувано от: VladSun в May 23, 2007, 00:20
Gaara ... чак ми иде да ти се накарам ;)

http://www.google.com/search?....loading

все пак първи линк е ;)

ПП: Пробвах го - ОК е :)


Титла: Perl download script и status bar
Публикувано от: neter в May 23, 2007, 02:17
Тъкмо се наканих да ти пращам същото, но видях, че VladSun ме е преварил  ;)
Все пак ще се отбележа с една лека модификация. Тъй като при онзи скрипт пътя до файла се задава при изпълнението на скрипта, т.е.
/home/user/script http://bla.bla/file
ето как трябва да стане, за да вкараме адреса към файла вътре в скрипта
Примерен код
#!/usr/bin/perl -w
use strict;
use Term::ProgressBar;
use URI;
use LWP::UserAgent;
    
my $ua = LWP::UserAgent->new;
    
my $url = 'http://ip.ludost.net/cgi/process?country=1&country_list=bg&format_template=prefix&format_name=&format_target=&format_default=bg_nets.txt';
print "$url:\n";
    
my $uri = URI->new($url);
my $path = $uri->path;
$path =~ s{.*/}{};
$path = "download" unless length $path;
$path = "X$path" while -e $path;
    
open my $outhandle, ">", $path or die "Cannot create $path: $!";
    
my $bar = Term::ProgressBar->new({ name => 'Download',
    count => 1024,
    ETA => 'linear'});
    
my $output = 0;
my $target_is_set = 0;
my $next_so_far = 0;
$ua->get
    ($url,
    ":content_cb" => sub {
    my ($chunk, $response, $protocol) = @_;
    
    unless ($target_is_set) {
    if (my $cl = $response->content_length) {
   $bar->target($cl);
   $target_is_set = 1;
    } else {
   $bar->target($output + 2 * length $chunk);
    }
    }
    
    $output += length $chunk;
    print {$outhandle} $chunk;
    
    if ($output >= $next_so_far) {
   $next_so_far = $bar->update($output);
    }
    });
    
$bar->target($output);
$bar->update($output);

Скрипта в оригинал е по-гъвкав при използване от потребител, за да си тегли файлчета. Преработката, според мен, е по-лесна за използване в crontab-ове и като boot скрипт.





Титла: Perl download script и status bar
Публикувано от: Gaara в May 24, 2007, 13:42
Блгодаря ви за помоща. Получи се доста .... свежо  :D

Всичко най ви желая