Ein Befehlszeilendienstprogramm, um zu visualisieren, wie schnell eine Datei wächst?

19

Ich möchte wissen, wie schnell eine bestimmte Datei wächst.

ich könnte

watch ls -l file

Und leiten Sie diese Informationen aus der Änderungsrate ab.

Gibt es etwas Ähnliches, das die Wachstumsrate der Datei im Laufe der Zeit direkt ausgibt?

ripper234
quelle

Antworten:

24

tail -f file | pv > /dev/null

Beachten Sie jedoch, dass beim Lesen der Datei mehr Ressourcen verbraucht werden als nur die Dateigröße.

gelraen
quelle
Das macht einen guten Job - nur um jemand anderem die eine oder andere Suche zu ersparen - du musst yum install pvein Centos / Redhat-System haben, um dies zu tun ;-)
Ralph Bolton
9

progress(Coreutils-Fortschrittsanzeige) oder neuere Versionen von pvkönnen einen Dateideskriptor eines bestimmten Prozesses anzeigen . Sie können also Folgendes tun:

lsof your-file

Um zu sehen, welcher Prozess ( $pid) darauf schreibt und auf welchem ​​Dateideskriptor ( $fd), und um Folgendes zu tun:

pv -d "$pid:$fd"

oder:

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

Ich habe ein kleines Perl-Skript, das ich als Funktion in meine Bash-Umgebung geschrieben habe:

fileSizeChange <file> [seconds]

Die Standardeinstellung für Ruhezustand ist 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"
}
Matt
quelle
1

Die folgende Shell-Funktion überwacht eine Datei oder ein Verzeichnis und zeigt eine Schätzung der Durchsatz- / Schreibgeschwindigkeit an. Ausführen mit monitorio <target_file_or_directory>. Wenn Ihr System kein du hat, was der Fall sein kann, wenn Sie den Durchsatz auf einem eingebetteten System überwachen, können Sie stattdessen ls verwenden (siehe Kommentar im Code).

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
}

Beispiel verwenden:

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
quelle
Danke das hat super geklappt! Ich habe ein paar kleine Änderungen vorgenommen, wenn sich jemand dafür interessiert. Die Dateiübertragung war nicht optimal, daher habe ich das Anhalten des Skripts deaktiviert, wenn sich die Dateigröße nicht geändert hat. Außerdem wurde ein optionaler zweiter Parameter zum Festlegen
Ben Baron