ฉันต้องการค้นหาว่าไฟล์ใดไฟล์หนึ่งเติบโตอย่างรวดเร็ว
ฉันทำได้
watch ls -l file
และอนุมานข้อมูลนี้จากอัตราการเปลี่ยนแปลง
มีบางสิ่งที่คล้ายกันที่จะส่งออกอัตราการเจริญเติบโตของไฟล์ในช่วงเวลาหนึ่ง ๆ โดยตรงหรือไม่?
ฉันต้องการค้นหาว่าไฟล์ใดไฟล์หนึ่งเติบโตอย่างรวดเร็ว
ฉันทำได้
watch ls -l file
และอนุมานข้อมูลนี้จากอัตราการเปลี่ยนแปลง
มีบางสิ่งที่คล้ายกันที่จะส่งออกอัตราการเจริญเติบโตของไฟล์ในช่วงเวลาหนึ่ง ๆ โดยตรงหรือไม่?
คำตอบ:
tail -f file | pv > /dev/null
แต่ระวังว่ามันเกี่ยวกับการอ่านไฟล์ด้วยตนเองดังนั้นมันอาจกินทรัพยากรมากกว่าสิ่งที่ดูเฉพาะขนาดไฟล์
progress
(ตัวแสดงความคืบหน้า Coreutils) หรือเวอร์ชันล่าสุดpv
สามารถดูตัวอธิบายไฟล์ของกระบวนการเฉพาะได้ ดังนั้นคุณสามารถทำได้:
lsof your-file
เพื่อดูว่าโพรเซส ( $pid
) เขียนอะไรลงไปและไฟล์ descriptor ( $fd
) ตัวใดและทำ:
pv -d "$pid:$fd"
หรือ:
progress -mp "$pid"
ฉันมีสคริปต์ Perl เล็กน้อยที่ฉันวางไว้ในสภาพแวดล้อมการทุบตีของฉันเป็นฟังก์ชั่น:
fileSizeChange <file> [seconds]
Sleep วินาทีจะมีค่าเริ่มต้นเป็น 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"
}
ฟังก์ชั่นเชลล์ต่อไปนี้จะตรวจสอบไฟล์หรือไดเรกทอรีและแสดงค่าประมาณปริมาณงาน / ความเร็วในการเขียน monitorio <target_file_or_directory>
ดำเนินการกับ หากระบบของคุณไม่มี du ซึ่งอาจเป็นกรณีที่คุณกำลังตรวจสอบ throughput 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
yum install pv
ใช้ระบบ Centos / Redhat เพื่อให้สามารถทำสิ่งนี้ได้ ;-)