¿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?

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.


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"

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"
}

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.