it-swarm.it

Visualizzare la velocità di trasferimento quando si esegue "cp" dalla riga di comando?

È possibile?

50
Chris

Il comando standard coreutils cp non supporta questo. C'è una patch Gentoo fluttuante che la aggiunge per versioni diverse, anche se non è più inclusa in Gentoo per qualche motivo; la versione per coreutils 6.10 è nella loro bugzilla , e sono sicuro che ce ne sono molti altri in giro.

Se non vuoi patchare cp, devi usare qualche altro comando. Ad esempio, rsync ha un --progress flag, quindi puoi fare:

rsync --progress source destination

Se invece di copiare i dati vengono cat catastati e quindi reindirizzare stdout alla destinazione (ovvero cat source > destination), quindi puoi utilizzare un programma che misura il throughput della pipe e inserirlo nel mezzo (cat source | SOME-PROGRAM > destination); ce ne sono alcuni citati in questa domanda correlata . Quello che ho raccomandato è stato pv (Pipe Viewer):

Screenshot of pv from the pv homepage

Se gli dai il --rate flag mostrerà la velocità di trasferimento

53
Michael Mrozek

Trovo che l'uso di PV in questo modo funzioni bene a tale scopo

pv -p file1 > file2

Il -p switch mostra l'avanzamento del trasferimento file. Per vedere la velocità di trasferimento, aggiungi -r interruttore. Se desideri visualizzare la velocità di trasferimento media nel tempo, puoi utilizzare -a interruttore.

pv -pra file1 > file2
17
Patrick

So che è piuttosto vecchio, ma ...

Se in realtà non vuoi visualizzare la tariffa, ma vuoi solo vedere se succede qualcosa durante la copia di un file di grandi dimensioni, puoi anche usare il comando watch (funziona anche con mv ):

cp /path/to/myfile /path/to/target/myfile

Quindi, in un'altra shell, o spingendo il comando copia sullo sfondo (ad es. Con Ctrl + Z seguito da bg), puoi controllare il risultato con:

watch "ls -sh1 /path/to/target"

Questo aggiornerà continuamente l'output dell'aggiornamento del comando ls (di default ogni 2.0s), mostrando qualcosa come:

Every 2.0s: ls -sh1 /path/to/target                                      
Tue Jan 12 15:02:45 2016

total 1.1G
4.0K data
130M tmp1.txt
137M tmp2.txt
151M tmp3.txt
168M tmp4.txt
162M myFile
9
muelleth

Ciao Un altro modo per mostrare la velocità di trasferimento è usare scp su localhost in questo modo:
scp -rv src_folder [email protected]:/dest_folder

5
Christoph Kuhr

Ecco uno script che utilizza du per monitorare la velocità effettiva. Questa è più indipendente dalle applicazioni e viene anche citata in https://unix.stackexchange.com/a/301490/183269 . Eseguire lo script sull'host di destinazione.

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
}

esempio usare:

[email protected]:~$ dd if=/dev/zero of=/tmp/zero bs=1 count=50000000 &
[email protected]:~$ 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
[email protected]:~$ killall dd; rm /tmp/zero
1
gesell