¿Una utilidad de línea de comandos para visualizar qué tan rápido está creciendo un archivo?

19

Quiero saber qué tan rápido está creciendo un archivo en particular.

Yo podría hacer

watch ls -l file

Y deduzca esta información de la tasa de cambio.

¿Hay algo similar que produzca directamente la tasa de crecimiento del archivo con el tiempo?

ripper234
fuente

Respuestas:

24

tail -f file | pv > /dev/null

Pero tenga en cuenta que implica la lectura real del archivo, por lo que podría consumir un poco más de recursos que algo que solo mire el tamaño del archivo.

gelraen
fuente
Esto hace un buen trabajo, solo para salvar a alguien más de una búsqueda o dos, necesitará yum install pven un sistema Centos / Redhat para poder hacer esto ;-)
Ralph Bolton
9

progress (Visor de progreso de Coreutils) o versiones recientes de pv pueden ver un descriptor de archivo de un proceso en particular. Entonces puedes hacer:

lsof your-file

para ver qué proceso ( $pid) le está escribiendo y en qué descriptor de archivo ($fd ), y hacer:

pv -d "$pid:$fd"

o:

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

Tengo una pequeña secuencia de comandos perl que puse en mi entorno bash como función:

fileSizeChange <file> [seconds]

Los segundos de suspensión predeterminados son 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"
}
Mate
fuente
1

La siguiente función de shell supervisa un archivo o directorio y muestra una estimación del rendimiento / velocidad de escritura. Ejecutar con monitorio <target_file_or_directory>. Si su sistema no tiene du, que podría ser el caso si está monitoreando el rendimiento de io en un sistema incorporado, entonces puede usar ls en su lugar (vea el comentario en el 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
}

ejemplo 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
fuente
Gracias esto funcionó muy bien! Hice algunas pequeñas modificaciones si alguien está interesado. Mi transferencia de archivos fue irregular, así que apagué la detención del script cuando el tamaño del archivo no cambia, también agregué un segundo parámetro opcional para establecer el intervalo y ya no imprimo el texto en la primera ejecución ya que siempre es 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Ben Baron