命令行实用程序,以可视化文件的增长速度?


19

我想了解特定文件的增长速度。

我可以做

watch ls -l file

并从变化率中推断出这些信息。

是否有类似的东西可以直接输出文件随时间的增长率?

Answers:


24

tail -f file | pv > /dev/null

但是请注意,它涉及通过声音读取文件,因此它可能比仅监视文件大小的资源消耗更多的资源。


这做得很好-只是节省了别人一两次搜索-您需要yum install pv在Centos / Redhat系统上才能做到这一点;-)
Ralph Bolton

9

progress(Coreutils进度查看器)或的最新版本pv可以查看特定进程的文件描述符。因此,您可以执行以下操作:

lsof your-file

查看$pid正在写入哪个进程()和在哪个文件描述符($fd)上执行以下操作:

pv -d "$pid:$fd"

要么:

progress -mp "$pid"

3

我在bash环境中有一个perl脚本功能:

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"
}

1

以下shell函数监视文件或目录,并显示吞吐量/写入速度的估计值。使用执行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
Ben Baron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.