Un'utilità da riga di comando per visualizzare la velocità di crescita di un file?


19

Voglio capire quanto velocemente sta crescendo un determinato file.

Potrei fare

watch ls -l file

E deduci queste informazioni dal tasso di variazione.

Esiste qualcosa di simile che produrrebbe direttamente il tasso di crescita del file nel tempo?

Risposte:


23

tail -f file | pv > /dev/null

Ma attenzione che comporta la lettura acuta del file, quindi potrebbe consumare un po 'più risorse rispetto a qualcosa che guarda solo le dimensioni del file.


Questo fa un buon lavoro - solo per salvare qualcun altro una ricerca o due - dovrai essere yum install pvsu un sistema Centos / Redhat per poterlo fare ;-)
Ralph Bolton,

10

progress(Coreutils progress viewer) o versioni recenti di pvpossono guardare un descrittore di file di un particolare processo. Quindi puoi fare:

lsof your-file

per vedere quale processo ( $pid) sta scrivendo su di esso e su quale descrittore di file ( $fd), e fare:

pv -d "$pid:$fd"

o:

progress -mp "$pid"

3

Ho un piccolo script perl che ho inserito nel mio ambiente bash come funzione:

fileSizeChange <file> [seconds]

I secondi di inattività predefiniti sono 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

La seguente funzione di shell controlla un file o una directory e mostra una stima della velocità di trasmissione / scrittura. Eseguire con monitorio <target_file_or_directory>. Se il tuo sistema non ha du, il che potrebbe essere il caso se stai monitorando il throughput di io su un sistema incorporato, puoi invece usare ls (vedi commento nel codice)

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
}

esempio usare:

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

Grazie ha funzionato benissimo! Ho apportato alcune piccole modifiche se qualcuno è interessato. Il mio trasferimento di file era irregolare, quindi ho disattivato l'arresto dello script quando la dimensione del file non cambia, ho anche aggiunto un secondo parametro opzionale per impostare l'intervallo e non ho più stampato il testo alla prima esecuzione poiché è sempre 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Ben Baron
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.