Bir dosyanın ne kadar hızlı büyüdüğünü görselleştirmek için bir komut satırı yardımcı programı?


19

Belirli bir dosyanın ne kadar hızlı büyüdüğünü görmek istiyorum.

Yapabilirim

watch ls -l file

Ve bu bilgiyi değişim hızından çıkarın.

Dosyanın zaman içinde büyüme hızını doğrudan çıktılayacak benzer bir şey var mı?

Yanıtlar:


23

tail -f file | pv > /dev/null

Ancak, dosyanın dosyayı okumayı içerdiğine dikkat edin, bu yüzden sadece dosya boyutunu izleyen bir şeyden biraz daha fazla kaynak tüketebilir.


Bu güzel bir iş yapar - sadece bir başkasını bir veya iki arama kaydetmek için - bunu yum install pvyapabilmek için Centos / Redhat sistemine ihtiyacınız olacak ;-)
Ralph Bolton

10

progress(Coreutils progress viewer) veya son sürümleri pvbelirli bir işlemin dosya tanımlayıcısını izleyebilir. Böylece şunları yapabilirsiniz:

lsof your-file

üzerine hangi process ( $pid) yazdığını ve hangi dosya tanımlayıcı ( $fd) üzerine yazdığını görmek için :

pv -d "$pid:$fd"

veya:

progress -mp "$pid"

3

Bir işlev olarak benim bash ortamına koymak küçük perl komut dosyası var:

fileSizeChange <file> [seconds]

Uyku saniye değeri varsayılan olarak 1'dir.

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

Aşağıdaki kabuk işlevi bir dosyayı veya dizini izler ve bir işlem / yazma hızı tahmini gösterir. İle çalıştırın monitorio <target_file_or_directory>. Sisteminizde du yoksa, gömülü bir sistemde io verimini izliyorsanız, bunun yerine ls kullanabilirsiniz (koddaki açıklamaya bakın)

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
}

örnek kullanım:

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

Teşekkürler bu harika çalıştı! İlgilenen varsa birkaç küçük değişiklik yaptım. Dosya aktarımım sivilceli oldu, bu yüzden dosya boyutu değişmediğinde komut dosyasını durdurmayı kapattım, aralığı ayarlamak için isteğe bağlı ikinci bir parametre ekledim ve artık her zaman 0 olduğu için ilk çalıştırmada metni yazdırmıyorum
Ben Baron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.