Một tiện ích dòng lệnh để hình dung một tệp đang phát triển nhanh như thế nào?


19

Tôi muốn tìm hiểu xem một tập tin cụ thể đang phát triển nhanh như thế nào.

tôi có thể làm

watch ls -l file

Và suy ra thông tin này từ tỷ lệ thay đổi.

Có một cái gì đó tương tự sẽ trực tiếp xuất tốc độ tăng trưởng của tập tin theo thời gian?

Câu trả lời:


24

tail -f file | pv > /dev/null

Nhưng hãy cẩn thận vì nó liên quan đến việc đọc tệp một cách nhanh chóng, vì vậy nó có thể tiêu tốn nhiều tài nguyên hơn một chút so với thứ chỉ xem kích cỡ tệp.


Đây là một công việc tốt - chỉ để cứu người khác một hoặc hai tìm kiếm - bạn sẽ cần yum install pvtrên hệ thống Centos / Redhat để có thể làm điều này ;-)
Ralph Bolton

9

progress(Trình xem tiến trình Coreutils) hoặc các phiên bản gần đây pvcó thể xem mô tả tệp của một quy trình cụ thể. Vì vậy, bạn có thể làm:

lsof your-file

để xem tiến trình nào ( $pid) đang ghi vào nó và trên đó mô tả tệp ( $fd) và làm:

pv -d "$pid:$fd"

hoặc là:

progress -mp "$pid"

3

Tôi có một tập lệnh perl nhỏ mà tôi đặt trong môi trường bash của mình dưới dạng hàm:

fileSizeChange <file> [seconds]

Ngủ giây mặc định là 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

Hàm shell sau đây giám sát một tập tin hoặc thư mục và hiển thị ước tính tốc độ thông lượng / ghi. Thực hiện với monitorio <target_file_or_directory>. Nếu hệ thống của bạn không có du, đó có thể là trường hợp nếu bạn đang theo dõi thông lượng io trên một hệ thống nhúng, thì bạn có thể sử dụng ls thay thế (xem nhận xét trong mã)

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
}

ví dụ sử dụng:

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

Cảm ơn điều này đã làm việc tuyệt vời! Tôi đã thực hiện một vài sửa đổi nhỏ nếu có ai quan tâm. Quá trình truyền tệp của tôi không ổn định nên tôi đã tắt dừng tập lệnh khi kích thước tệp không thay đổi, đồng thời thêm tham số thứ hai tùy chọn để đặt khoảng thời gian và không còn in văn bản trong lần chạy đầu tiên vì nó luôn là 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Ben Baron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.