Narzędzie wiersza polecenia do wizualizacji, jak szybko rośnie plik?


19

Chcę się przekonać, jak szybko rośnie dany plik.

mógłbym zrobić

watch ls -l file

I wydedukuj te informacje od tempa zmian.

Czy istnieje coś podobnego, co bezpośrednio wyprowadzałoby tempo wzrostu pliku w czasie?

Odpowiedzi:


23

tail -f file | pv > /dev/null

Ale uważaj, że wymaga to dokładnego odczytu pliku, więc może zużywać nieco więcej zasobów niż coś, co obserwuje tylko rozmiar pliku.


To niezła robota - aby uratować kogoś innym lub dwóm wyszukiwarkom - musisz mieć yum install pvsystem Centos / Redhat, aby móc to zrobić ;-)
Ralph Bolton

10

progress(Coreutils progress viewer) lub najnowsze wersje pvmogą oglądać deskryptor pliku określonego procesu. Możesz więc zrobić:

lsof your-file

aby zobaczyć, jaki proces ( $pid) do niego pisze i na którym deskryptorze pliku ( $fd), i wykonaj:

pv -d "$pid:$fd"

lub:

progress -mp "$pid"

3

Mam mały skrypt perla, który umieszczam w moim środowisku bash jako funkcję:

fileSizeChange <file> [seconds]

Sekundy uśpienia są domyślnie ustawione na 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

Poniższa funkcja powłoki monitoruje plik lub katalog i pokazuje oszacowanie przepustowości / prędkości zapisu. Wykonaj za pomocą monitorio <target_file_or_directory>. Jeśli twój system nie ma du, co może mieć miejsce, jeśli monitorujesz przepustowość io we wbudowanym systemie, możesz zamiast tego użyć ls (patrz komentarz w kodzie)

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
}

przykład użycia:

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

Dzięki, działało świetnie! Wprowadziłem kilka drobnych modyfikacji, jeśli ktoś jest zainteresowany. Mój transfer plików był nierówny, więc wyłączyłem zatrzymywanie skryptu, gdy rozmiar pliku się nie zmienia, dodałem także opcjonalny drugi parametr, aby ustawić interwał, i nie drukuję
Ben Baron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.