Um utilitário de linha de comando para visualizar a rapidez com que um arquivo está crescendo?

19

Quero entender a rapidez com que um arquivo específico está crescendo.

eu poderia fazer

watch ls -l file

E deduza essas informações da taxa de mudança.

Existe algo semelhante que produziria diretamente a taxa de crescimento do arquivo ao longo do tempo?

ripper234
fonte

Respostas:

24

tail -f file | pv > /dev/null

Mas lembre-se de que envolve a leitura correta do arquivo, para que possa consumir um pouco mais de recursos do que algo que assiste apenas ao tamanho do arquivo.

gelraen
fonte
Isso faz um bom trabalho - apenas para salvar alguém de uma pesquisa ou dois - você vai precisar yum install pvde um sistema Centos / Redhat para ser capaz de fazer isso ;-)
Ralph Bolton
9

progress(Visualizador de progresso do Coreutils) ou versões recentes do pvpode assistir a um descritor de arquivo de um processo específico. Então você pode fazer:

lsof your-file

para ver qual process ( $pid) está gravando nele e em qual descritor de arquivo ( $fd), e faça:

pv -d "$pid:$fd"

ou:

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

Eu tenho um pequeno script perl que eu coloquei no meu ambiente bash como uma função:

fileSizeChange <file> [seconds]

O padrão dos segundos de suspensão é 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
fonte
1

A função shell a seguir monitora um arquivo ou diretório e mostra uma estimativa da velocidade de transferência / gravação. Execute com monitorio <target_file_or_directory>. Se o seu sistema não tiver du, o que poderia ser o caso se você estiver monitorando a taxa de transferência io em um sistema incorporado, poderá usar ls (consulte o comentário no código)

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
}

exemplo de uso:

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
fonte
Graças isso funcionou muito bem! Fiz algumas pequenas modificações, se alguém estiver interessado. Minha transferência de arquivos estava irregular, então desativei a interrupção do script quando o tamanho do arquivo não muda, também adicionei um segundo parâmetro opcional para definir o intervalo e não imprimi mais o texto na primeira execução, pois sempre é 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Ben Baron