Доброго дня всем !Делаю скрипт, чтобы определить скорость клонирования съемного диска в образ. Использую стандартную утилиту dd. Сделал графический интерфейс на Perl-Tk.
Просто вызываю команду в скрипте на перле system "dd if=$source of=$dest &" и начинаю считывать и сравнивать каждую секунду размер файла $dest с размером исходного $source. Из разницы размеров и промежутке прошедшего времени вычисляю скорость. Когда оба размера равны,вывожу что файл-образ создан.
Алгоритм работает, но он не совершенен в том плане, что если я буду еще и архивировать на лету образ, или проверять хэш, то алгорит не будет работать.
Ищу замену этому алгоритму. Из программы AIR я нашел такой вариант:
Первой командой файл источник пропускается через функцию counter, где высчитывается скорость передачи данных, потом данные записываются в именованный канал (fifo.file)
А второй командой данные из fifo.file записываются в $dest.
dd if=$source 2>> /log.log | /counter 2>> /buffer.log | tee /fifo.file | md5sum > /hash.log 2>&1;
dd if=/fifo.file 2>> /log.log of=$dest >> /log.log 2>&1;
Проблема в том что эти команды не работают. Все прекращается когда первые 10 Мб данных передаются в файл счетчик /counter.
Подскажите в чем может быть проблема?
код файла /counter
my ($bytes_read, $count, $megs, $gigs);
my ($start_time, $stop_time, $mid_time, $total_time, $mb_sec);
my ($buffer, $buffer_size);
if ($ARGV[0]) {
$buffer_size = $ARGV[0];
print STDERR "buffer_size=$buffer_size\n";
} else {
$buffer_size = 10485760; # 10MB
}
$count = 0;
$megs = 0;
$gigs = 0;
$start_time = time();
while($bytes_read = read(STDIN,$buffer,$buffer_size)) {
$count = $count + $bytes_read;
$megs = $count / 1024 / 1024;
$gigs = $megs / 1024;
$mid_time = time();
$total_time = $mid_time - $start_time;
if ($total_time == 0) {
$total_time = 1;
}
$mb_sec = $megs / $total_time;
printf (STDERR "Progress: %.2fMB (%.2fGB)\tAvg. Throughput: %.2fMB/sec\n",$megs,$gigs,$mb_sec);
print STDOUT $buffer;
}
$stop_time = time();
$total_time = $stop_time - $start_time;
if ($total_time == 0) {
$total_time = 1;
}
$mb_sec = $megs / $total_time;
printf (STDERR "Finished: %.2fMB (%.2fGB)\tAvg. Throughput: %.2fMB/sec\n",$megs,$gigs,$mb_sec);