сразу скажу, что Linuxe и Perl новичек и возможно есть другие способы определения скорости, но я намутил вот что
скрипт запускается с периодичностью в минуту.. поэтому в подпрограмме идет деление на 60 (секунд) ====================================================================== #!/usr/bin/perl
my $tr = traf('eth1');
my $speed = speed($tr); print STDERR "\nIN: $speed->{'in'} kb/s, OUT: $speed->{'out'} kb/s\n\n";
sub traf { my $int = shift; my @eth = `ifconfig $int`; my %traf; $traf{'collis'} = "0"; $traf{'output'} = "0"; $traf{'input'} = "0"; # Возвращаем нули, если был указан не правильный интерфейс return \%traf if (scalar(@eth)<3); # Считываем весь массив и забираем только те значения # где хранятся коллизии и переданные байты my @val = grep(/.*?(collisions|RX bytes)/,@eth); $val[0] =~ /.*?(\d+)\s+.*/; $traf{'collis'} = $1;
$val[1] =~ /.*?(\d+)\s+\(.*?\).*?(\d+)\s+.*/; $traf{'output'} = $2; $traf{'input'} = $1;
# Открываем файл и забираем от туда значения open(ETH,"$DIR/eth_last"); my @value = split(/\s/,<ETH>); close(ETH); # Открываем еще раз файл, но уже на запись # Записываем туда последние значения, которые были получены open(ETH,">$DIR/eth_last"); print ETH "$traf{'collis'} $traf{'output'} $traf{'input'}"; close(ETH);
# Сравниваем те значения, которые были считанны с файла # и те, которые только что получили. # Если в файле значения меньше тех которые мы только что получили, то # от текущих значений отнимаем предыдущие. # Мы бы могли использовать в базе значения COUNT, но тогда будет не # верный отсчет, если интерфейс упадет, или компьютер будет # перезапущен. if (defined($value[0]) and $traf{'output'} > $value[1]) { $traf{'output'} -= $value[1]; $traf{'input'} -= $value[2]; $traf{'collis'} -= $value[0]; } else { # Мы не можем с точностью определить сколько времени работал # интерфейс, и поэтому приравняем элементы хеша к нулю. # При следующем запросе мы высчитаем разницу с теми значениями, # которые были записаны в файл $traf{'collis'} = 0; $traf{'output'} = 0; $traf{'input'} = 0; }; # Записываем в файл текущие значения open(ETH,">$DIR/eth_cur"); print ETH "$traf{'collis'} $traf{'output'} $traf{'input'}"; close(ETH);
return \%traf; }
sub speed { my $pk = shift; my %spd; $spd{'in'} = sprintf("%.1f",$pk->{'input'} / 60 / 1024 * 10); $spd{'out'} = sprintf("%.1f",$pk->{'output'} / 60 / 1024 * 10); return \%spd; } ====================================================================== Получаю примерно вот что:
IN: 35.3 kb/s, OUT: 165.9 kb/s
Естественно погрешность большая... как вычислить точно?
Может есть другие способы?