Утилита командной строки для визуализации скорости роста файла?

19

Я хочу узнать, как быстро растет конкретный файл.

я мог бы сделать

watch ls -l file

И вывести эту информацию из скорости изменения.

Есть ли что-то подобное, что напрямую выводило бы скорость роста файла с течением времени?

ripper234
источник

Ответы:

23

tail -f file | pv > /dev/null

Но имейте в виду, что для этого требуется чтение файла, поэтому он может потреблять немного больше ресурсов, чем тот, который отслеживает только размер файла.

gelraen
источник
Это делает хорошую работу - просто чтобы сохранить кому-то еще поиск или два - вам понадобится yum install pvсистема Centos / Redhat, чтобы иметь возможность сделать это ;-)
Ральф Болтон
10

progress(Coreutils Progress Viewer) или последние версии pvмогут просматривать файловый дескриптор определенного процесса. Так что вы можете сделать:

lsof your-file

чтобы увидеть, что process ( $pid) записывает в него и в каком дескрипторе файла ( $fd), и выполните:

pv -d "$pid:$fd"

или:

progress -mp "$pid"
Стефан Шазелас
источник
3

У меня есть небольшой скрипт на Perl, который я добавил в свою среду bash как функцию:

fileSizeChange <file> [seconds]

Время сна по умолчанию равно 1.

fileSizeChange() {
  perl -e '
  $file = shift; die "no file [$file]" unless -f $file; 
  $sleep = shift; $sleep = 1 unless $sleep =~ /^[0-9]+$/;
  $format = "%0.2f %0.2f\n";
  while(1){
    $size = ((stat($file))[7]);
    $change = $size - $lastsize;
    printf $format, $size/1024/1024, $change/1024/1024/$sleep;
    sleep $sleep;
    $lastsize = $size;
  }' "$1" "$2"
}
Matt
источник
1

Следующая функция оболочки отслеживает файл или каталог и показывает оценку скорости передачи / записи. Выполнить с monitorio <target_file_or_directory>. Если в вашей системе нет du, что может быть в случае, если вы отслеживаете пропускную способность io во встроенной системе, тогда вы можете использовать вместо нее ls (см. Комментарий в коде)

monitorio () {
# show write speed for file or directory
    interval="10"
    target="$1"
    size=$(du -ks "$target" | awk '{print $1}')
    firstrun="1"
    echo ""
    while [ 1 ]; do
        prevsize=$size
        size=$(du -ks "$target" | awk '{print $1}')
        #size=$(ls -l "$1"  | awk '{print $5/1024}')
        kb=$((${size} - ${prevsize}))
        kbmin=$((${kb}* (60/${interval}) ))
        kbhour=$((${kbmin}*60))
        # exit if this is not first loop & file size has not changed
        if [ $firstrun -ne 1 ] && [ $kb -eq 0 ]; then break; fi
        echo -e "\e[1A $target changed ${kb}KB ${kbmin}KB/min ${kbhour}KB/hour size: ${size}KB"
        firstrun=0
        sleep $interval
    done
}

пример использования:

user@host:~$ dd if=/dev/zero of=/tmp/zero bs=1 count=50000000 &
user@host:~$ monitorio /tmp/zero
/tmp/zero changed 4KB 24KB/min 1440KB/hour size: 4164KB
/tmp/zero changed 9168KB 55008KB/min 3300480KB/hour size: 13332KB
/tmp/zero changed 9276KB 55656KB/min 3339360KB/hour size: 22608KB
/tmp/zero changed 8856KB 53136KB/min 3188160KB/hour size: 31464KB
^C
user@host:~$ killall dd; rm /tmp/zero
Гезелл
источник
Спасибо, это отлично сработало! Я сделал несколько небольших модификаций, если кому-то интересно. Передача файлов была нечеткой, поэтому я отключил остановку сценария, когда размер файла не изменился, также добавил необязательный второй параметр для установки интервала и больше не печатал текст при первом запуске, поскольку он всегда равен 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Бен Барон,