Come si controlla l'avanzamento di dd?

546

dd è una meraviglia. Ti consente di duplicare un disco rigido in un altro, azzerare completamente un disco rigido, ecc. Ma una volta lanciato un comando dd , non c'è nulla che ti indichi i suoi progressi. Si trova semplicemente lì al cursore finché il comando non termina. Quindi, come monitora il progresso di dd?

    
posta James 10.11.2012 - 21:24

19 risposte

392

Da HowTo: monitora l'avanzamento di dd

Puoi monitorare l'avanzamento di dd senza interromperlo usando il comando kill .

Per vedere il progresso di dd una volta eseguito, apri un altro terminale e inserisci:

sudo kill -USR1 $(pgrep ^dd)

Questo mostrerà l'avanzamento di dd nella finestra di terminale dd senza interrompere il processo. Se sei su BSD o OS X, usa INFO invece di USR1 . Il segnale USR1 terminerà dd.

Se desideri ricevere aggiornamenti regolari del progresso di dd , inserisci:

watch -n5 'sudo kill -USR1 $(pgrep ^dd)'

watch analizzerà il processo dd ogni -n secondi ( -n5 = 5 secondi) e segnalerà senza interromperlo.

Nota le virgolette singole corrette nei comandi sopra.

    
risposta data James 10.11.2012 - 21:44
594

Aggiornamento 2016 : se usi GNU coreutils & gt; = 8.24 (predefinito in Ubuntu Xenial 16.04 in alto), vedi il metodo 2 di seguito per un modo alternativo di mostrare i progressi .

Metodo 1: utilizzando pv

Installa pv e inseriscilo tra i comandi di input / output solo dd .

Nota : non puoi usarlo quando hai già avviato dd .

Da alla descrizione del pacchetto :

  

pv - Pipe Viewer - è uno strumento basato sul terminale per il monitoraggio del   avanzamento dei dati attraverso una pipeline. Può essere inserito in qualsiasi   normale pipeline tra due processi per dare un'indicazione visiva   quanto velocemente passano i dati, quanto tempo ha impiegato, quanto vicino   a completamento è, e una stima di quanto tempo sarà fino a quando   completamento.

Installazione

sudo apt-get install pv

Esempio

dd if=/dev/urandom | pv | dd of=/dev/null

Output

1,74MB 0:00:09 [ 198kB/s] [      <=>                               ]

Potresti specificare la dimensione approssimativa con --size se desideri una stima del tempo.

Esempio Supponendo che un disco da 2 GB venga copiato da / dev / sdb

Il comando senza pv sarebbe:

sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096

Comando con pv :

sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096

Output:

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

Altri usi

Ovviamente puoi usare pv direttamente per reindirizzare l'output a stdout:

pv /home/user/bigfile.iso | md5sum

Output

50,2MB 0:00:06 [8,66MB/s] [=======>         ] 49% ETA 0:00:06

Tieni presente che in questo caso, pv riconosce automaticamente la dimensione.

Metodo 2: Nuova opzione status aggiunta a dd (GNU Coreutils 8.24 +)

dd in GNU Coreutils 8.24+ (Ubuntu 16.04 e successivi) ha ottenuto una nuova opzione status per visualizzare lo stato di avanzamento:

Esempio

dd if=/dev/urandom of=/dev/null status=progress

uscita
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
    

risposta data phoibos 11.11.2012 - 03:04
87

Alcuni utili esempi di utilizzo con pv e meno la digitazione o più progressi rispetto ad altre risposte:

Per prima cosa dovrai installare pv , con il comando:

sudo apt-get install pv

Quindi alcuni esempi sono:

pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror

Nota: il primo campione è composto da 5 caratteri in meno, quindi dd if=/dev/urandom | pv | dd of=/dev/null .

E il mio preferito per clonare un'unità disco:

(pv -n /dev/sda | dd of=/dev/sdb bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0

fonte: link

Anche per l'archiviazione.

    
risposta data JSBach 27.08.2014 - 16:01
56

Usa Ctrl + Maiusc + T mentre dd è in esecuzione, e produrrà l'avanzamento (in byte):

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
    
risposta data 01010101 17.10.2014 - 16:15
43

Per completezza:

La versione 8.24 dei coreutils GNU include una patch per dd che introduce un parametro per stampare il progresso.

Il commit che introduce questa modifica ha il commento :

  

dd: nuovo livello status = progress per stampare periodicamente le statistiche

Molte distribuzioni, incluso Ubuntu 16.04.2 LTS usano questa versione.

    
risposta data davidDavidson 15.10.2015 - 11:24
31

Il meglio sta usando il link è facile da installare tramite apt-get

    
risposta data TheNano 12.03.2013 - 15:11
22

Lo stato di avanzamento nativo è stato aggiunto a dd !!!

La nuova versione di Coreutils (8.24) aggiunge uno stato di avanzamento allo strumento dd :

Utilizzo su Xubuntu 15.10:

Apri un terminale e digita questi comandi:

wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)

Esegui dd come utente root:

sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress

Verranno visualizzati: byte, secondi e velocità (byte / secondo).

Per verificare le versioni di dd :

Le mie origini:

dd --version

cd coreutils-8.24/src
./dd --version
    
risposta data user3394963 30.12.2015 - 17:29
16

Se hai già avviato dd e se stai scrivendo un file come quando crei una copia di una pendrive su disco, puoi usare il comando watch per osservare costantemente la dimensione del file di output per vedere le modifiche e il completamento delle stime .

watch ls -l /pathtofile/filename

Per vedere solo la dimensione del file (h-human view):

watch ls -sh /pathtofile/filename
    
risposta data fabricator4 07.12.2012 - 22:46
11

La triade dd | pv | dd ha reso la mia copia da 50GB vm impiegando 800 secondi, invece di 260 secondi usando solo dd. Con questa pipeline, almeno, pv non ha idea di quanto sia grande il file di input, quindi non sarà in grado di dirti quanto sei lontano così non c'è alcun svantaggio nel farlo come segue- e ottieni un vantaggio di velocità piacevole:

Eviterei pv su qualcosa di grande, e (se uso Bash):

Control-Z il processo dd

bg per metterlo in background. Osserva che bg ti darà un output come [1] 6011 dove quest'ultimo numero è un id di processo. Quindi, fai:

while true; do kill -USR1 process_id ; sleep 5; done

dove process_id è l'id di processo che hai osservato. Premi Control-C quando vedi qualcosa del tipo:

[1]+  Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process

Hai finito.

Modifica: Silly Systems Administrator! Automatizza la tua vita, non lavorare! Se ho un lungo processo dd che voglio monitorare, ecco un one-liner che si prenderà cura di tutta la enchilada per te; metti tutto su una riga:

 dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done

Puoi, ovviamente, programmarlo, magari creare $ 1 come file di input e $ 2 come file di output. Questo è lasciato come esercizio per il lettore. Nota che hai bisogno di dormire poco prima che l'uccisione o l'uccisione possa morire cercando di inviare un segnale a dd quando non è ancora pronto. Regola il sonno nel modo desiderato (magari anche rimuovendo del tutto il secondo sonno).

Bash- FTW! : -)

    
risposta data Mike S 06.05.2015 - 20:32
10

link

In sostanza:

kill -USR1 < dd pid >
    
risposta data hnasarat 10.11.2012 - 21:30
6

Su Ubuntu 16.04

Ubuntu 16.04 viene fornito con la versione di dd (coreutils) 8.25 . Quindi l'opzione status=progress è supportata: -)

Per usarlo, aggiungi solo status=progress insieme al tuo comando dd .

Esempio:

dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync

Fornisce lo stato di

1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s

    
risposta data Severus Tux 25.06.2016 - 06:54
6

Il più semplice è:

 dd if=... of=... bs=4M status=progress oflag=dsync

oflag=dsync manterrà la tua scrittura sincronizzata, quindi le informazioni di status=progress sono più accurate. Tuttavia potrebbe essere un po 'più lento.

    
risposta data zevero 04.10.2016 - 08:46
3

Ho creato bash wrapper su dd che userà pv per mostrare lo stato di avanzamento. Inseriscilo nella tua .bashrc e usa dd come al solito:

# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
    2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%            
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s

Fonte:

dd()
{
    local dd=$(which dd); [ "$dd" ] || {
        echo "'dd' is not installed!" >&2
        return 1
    }

    local pv=$(which pv); [ "$pv" ] || {
        echo "'pv' is not installed!" >&2
        "$dd" "[email protected]"
        return $?
    }

    local arg arg2 infile
    local -a args
    for arg in "[email protected]"
    do
        arg2=${arg#if=}
        if [ "$arg2" != "$arg" ]
        then
            infile=$arg2
        else
            args[${#args[@]}]=$arg
        fi
    done

    "$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}
    
risposta data midenok 20.10.2014 - 13:32
3

Mi piace molto ddrescue, funziona come dd ma dà output e non fallisce sugli errori, al contrario ha un algoritmo molto avanzato e ci vuole davvero molto per fare una copia di successo ... Ci sono anche molte GUI per it

Progetto: link

Wikipedia: link

    
risposta data SuperMau 17.02.2016 - 06:55
2

Quindi oggi mi sono un po 'frustrato nel provare a eseguire kill in un ciclo mentre dd era in esecuzione, e ho trovato questo metodo per eseguirli in parallelo, facilmente:

function vdd {
    sudo dd "[email protected]" &
    sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}

Ora usa vdd ovunque utilizzi normalmente dd (passa tutti gli argomenti direttamente attraverso) e riceverai un rapporto sullo stato di avanzamento ogni 5 s.

L'unico svantaggio è che il comando non ritorna immediatamente quando dd termina; quindi è possibile che questo comando possa farti aspettare 5 secondi in più dopo che dd ritorna prima che si accorga ed esca.

    
risposta data robru 11.04.2014 - 02:41
1

Come menzionato sopra, almeno con 'dd' da GNU coreutils, o busybox, risponderà a un segnale USR1 stampando le informazioni sullo stato di avanzamento su stderr.

Ho scritto un piccolo script wrapper per dd che mostra un bel indicatore di percentuale completa, e cerca di non interferire con il processo di dd o il modo di funzionare in alcun modo. Puoi trovarlo su github:

link

Sfortunatamente, questo trucco SIGUSR1 funziona solo con GNU dd (dal pacchetto coreutils) o con la modalità 'dd' di busybox con quella specifica funzione abilitata in fase di compilazione. Non funziona con lo stock 'dd' incluso nella maggior parte dei sistemi BSD, inclusi FreeBSD e OS X ...: (

    
risposta data delt 10.09.2015 - 08:29
1

Questo impone a dd di fornire statistiche ogni 2 secondi che è l'impostazione predefinita per l'orologio:

watch killall -USR1 dd

Per passare da ogni 2 secondi a ogni 5 secondi, aggiungi l'opzione -n ​​5 in questo modo:

watch -n 5 killall -USR1 dd
    
risposta data Kostyantyn 30.01.2018 - 21:24
1

Usa l'opzione status=progress per ottenere il progresso durante il trasferimento.

Inoltre, conv=fsync visualizzerà errori I / O.

Esempio:

sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
    
risposta data MUY Belgium 25.05.2018 - 13:38
0

Puoi vedere lo stato di avanzamento di qualsiasi programma coreutils utilizzando progress - Coreutils Progress Viewer .

Può monitorare:

cp mv dd tar cat rsync grep fgrep egrep taglio sort md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unzz lzma unlzma 7z 7za zcat bzcat lzcat split gpg

Puoi consultare la manpage

Puoi usarlo in una finestra di terminale separata mentre il comando è in esecuzione o avviarlo con il comando dd:

dd if=/dev/sda of=file.img & progress -mp $!

Qui & esegue il primo comando e continua immediatamente anziché attendere fino alla fine del comando.

Il comando di avanzamento viene avviato con: -m quindi attende fino al termine del processo monitorato, -p in modo da monitorare un dato pid e $! è l'ultimo comando pid.

Se si esegue il comando dd con sudo, è necessario farlo anche con il progresso:

sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid
    
risposta data labsin 22.07.2018 - 22:06

Leggi altre domande sui tag