Un utilitaire de ligne de commande pour visualiser la vitesse de croissance d'un fichier?


19

Je veux savoir à quelle vitesse un fichier particulier se développe.

je pourrais faire

watch ls -l file

Et déduisez ces informations du taux de variation.

Y a-t-il quelque chose de similaire qui produirait directement le taux de croissance du fichier au fil du temps?

Réponses:


23

tail -f file | pv > /dev/null

Mais sachez que cela implique de lire le fichier en temps réel, il pourrait donc consommer un peu plus de ressources que quelque chose qui ne regarde que la taille du fichier.


Cela fait un bon travail - juste pour sauver quelqu'un d'autre une recherche ou deux - vous aurez besoin d' yum install pvun système Centos / Redhat pour pouvoir le faire ;-)
Ralph Bolton

10

progress(Coreutils progress viewer) ou des versions récentes de pvpeuvent regarder un descripteur de fichier d'un processus particulier. Vous pouvez donc faire:

lsof your-file

pour voir quel processus ( $pid) y écrit et sur quel descripteur de fichier ( $fd), et faire:

pv -d "$pid:$fd"

ou:

progress -mp "$pid"

3

J'ai un petit script perl que je mets dans mon environnement bash en fonction:

fileSizeChange <file> [seconds]

La seconde de sommeil par défaut est 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 fonction shell suivante surveille un fichier ou un répertoire et affiche une estimation du débit / de la vitesse d'écriture. Exécutez avec monitorio <target_file_or_directory>. Si votre système n'a pas de du, ce qui pourrait être le cas si vous surveillez le débit io sur un système embarqué, vous pouvez utiliser ls à la place (voir le commentaire dans le 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
}

exemple d'utilisation:

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

Merci, cela a très bien fonctionné! J'ai fait quelques petites modifications si quelqu'un est intéressé. Mon transfert de fichiers a été irrégulier, j'ai donc désactivé l'arrêt du script lorsque la taille du fichier ne change pas, j'ai également ajouté un deuxième paramètre facultatif pour définir l'intervalle et ne plus imprimer le texte lors de la première exécution car il est toujours 0: gist.github .com / einsteinx2 / 14a0e865295cf66aa9a9bf1a8e46ee49
Ben Baron
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.