Utilitas baris perintah untuk memvisualisasikan seberapa cepat file tumbuh?

19

Saya ingin grok seberapa cepat file tertentu tumbuh.

Saya bisa melakukannya

watch ls -l file

Dan simpulkan informasi ini dari tingkat perubahan.

Apakah ada sesuatu yang serupa yang akan langsung menghasilkan laju pertumbuhan file dari waktu ke waktu?

ripper234
sumber

Jawaban:

24

tail -f file | pv > /dev/null

Namun berhati-hatilah karena ini melibatkan pembacaan file secara akut, sehingga mungkin mengkonsumsi sumber daya sedikit lebih banyak daripada sesuatu yang hanya melihat ukuran file.

gelraen
sumber
Ini melakukan pekerjaan yang bagus - hanya untuk menyelamatkan orang lain satu atau dua pencarian - Anda harus yum install pvmenggunakan sistem Centos / Redhat untuk dapat melakukan ini ;-)
Ralph Bolton
9

progress(Coreutils progress viewer) atau versi terbaru dari pvdapat menonton deskriptor file dari proses tertentu. Jadi kamu bisa melakukan:

lsof your-file

untuk melihat proses apa ( $pid) yang menulis padanya dan pada file mana deskriptor ( $fd), dan lakukan:

pv -d "$pid:$fd"

atau:

progress -mp "$pid"
Stéphane Chazelas
sumber
3

Saya memiliki skrip perl kecil yang saya tempatkan di lingkungan bash sebagai fungsi:

fileSizeChange <file> [seconds]

Sleep detik default ke 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"
}
Mat
sumber
1

Fungsi shell berikut memantau file atau direktori dan menunjukkan perkiraan kecepatan throughput / tulis. Jalankan dengan monitorio <target_file_or_directory>. Jika sistem Anda tidak memiliki du, yang bisa terjadi jika Anda memantau throughput io pada sistem embedded, maka Anda dapat menggunakan ls sebagai gantinya (lihat komentar dalam kode)

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
}

contoh gunakan:

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
gesell
sumber
Terima kasih ini berhasil! Saya membuat beberapa modifikasi kecil jika ada yang tertarik. Transfer file saya tidak teratur sehingga saya mematikan skrip ketika ukuran file tidak berubah, juga menambahkan parameter opsional kedua untuk mengatur interval, dan tidak lagi mencetak teks pada proses pertama karena selalu 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Ben Baron