Câu trả lời:
progress
(Trình xem tiến trình Coreutils) hoặc các phiên bản gần đây pv
có 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"
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"
}
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
yum install pv
trên hệ thống Centos / Redhat để có thể làm điều này ;-)