Wie überwachen Sie den Fortschritt von dd?

562

dd ist ein Wunder. Damit können Sie eine Festplatte auf eine andere kopieren, eine Festplatte komplett auf Null setzen, usw. Wenn Sie jedoch einen Befehl dd starten, können Sie nichts über den Fortschritt der Festplatte feststellen. Es steht einfach so am Cursor, bis der Befehl beendet ist. Wie kann man also den Fortschritt von dd überwachen?

    
James 10.11.2012, 21:24

19 Antworten

400

Von Anleitung: Überwachung des Fortschritts von dd

Sie können den Fortschritt von dd mit dem Befehl kill überwachen, ohne ihn anzuhalten.

Um den Fortschritt von dd anzuzeigen, öffnen Sie ein anderes Terminal und geben Folgendes ein:

sudo kill -USR1 $(pgrep ^dd)

Dadurch wird der Fortschritt von dd im Terminalfenster von dd angezeigt, ohne dass der Prozess angehalten wird. Wenn Sie BSD oder OS X verwenden, verwenden Sie INFO anstelle von USR1 . Das USR1 -Signal beendet dd.

Wenn Sie regelmäßige Aktualisierungen des dd progress erhalten möchten, geben Sie Folgendes ein:

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

watch prüft den Prozess dd alle -n Sekunden ( -n5 = 5 Sekunden) und meldet, ohne ihn anzuhalten.

Beachten Sie die richtigen einfachen Anführungszeichen in den obigen Befehlen.

    
James 10.11.2012, 21:44
620

Update 2016 : Wenn Sie GNU coreutils > = 8.24 verwenden (standardmäßig in Ubuntu Xenial 16.04 aufwärts), finden Sie unter Methode 2 eine alternative Möglichkeit, den Fortschritt anzuzeigen .

Methode 1: Durch Verwendung von pv

Installieren Sie pv und setzen Sie den Befehl dd nur auf Eingabe / Ausgabe.

Hinweis : Sie können es nicht verwenden, wenn Sie dd bereits gestartet haben.

Von der Paketbeschreibung :

  

pv - Pipe Viewer - ist ein Terminal-basiertes Tool zur Überwachung der   Fortschritt der Daten durch eine Pipeline. Es kann in jedes eingefügt werden   normale Pipeline zwischen zwei Prozessen, um eine visuelle Anzeige von   wie schnell Daten durchlaufen, wie lange es gedauert hat, wie nah   Bis zur Fertigstellung ist es eine Schätzung, wie lange es dauern wird, bis   Fertigstellung.

Installation

sudo apt-get install pv

Beispiel

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

Ausgabe

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

Sie können die ungefähre Größe mit --size angeben, wenn Sie eine Zeitschätzung wünschen.

Beispiel Angenommen, eine 2-GB-Festplatte wird aus / dev / sdb

kopiert

Befehl ohne pv wäre:

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

Befehl mit pv :

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

Ausgabe:

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

Andere Verwendungen

Sie können natürlich auch pv verwenden, um die Ausgabe an stdout zu leiten:

pv /home/user/bigfile.iso | md5sum

Ausgabe

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

Beachten Sie, dass in diesem Fall pv die Größe automatisch erkennt.

Methode 2: Neue Option status zu dd (GNU Coreutils 8.24 +) hinzugefügt

dd in GNU Coreutils 8.24+ (Ubuntu 16.04 und neuer) hat eine neue Option status zur Anzeige des Fortschritts erhalten:

Beispiel

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

Ausgabe

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
    
phoibos 11.11.2012 03:04
89

Einige praktische Beispielverwendungen mit pv und weniger Tippen oder mehr Fortschritt als andere Antworten:

Zuerst müssen Sie pv mit dem Befehl:

installieren
sudo apt-get install pv

Nachfolgend einige Beispiele:

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

Hinweis: Das erste Beispiel umfasst 5 Zeichen weniger als dd if=/dev/urandom | pv | dd of=/dev/null .

Und mein Favorit für das Klonen eines Laufwerks:

(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

source: link

Auch zum Archivieren von mir.

    
JSBach 27.08.2014 16:01
56

Verwenden Sie Strg + Shift + T , während dd ausgeführt wird, und gibt den Fortschritt (in Bytes) aus:

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)
    
01010101 17.10.2014 16:15
46

Der Vollständigkeit halber:

Version 8.24 der GNU coreutils enthält einen Patch für dd, der einen Parameter zum Drucken des Fortschritts enthält.

Diese Änderung hat den Kommentar :

  

dd: neue status = progress -Ebene zum regelmäßigen Drucken von Statistiken

Viele Distributionen, einschließlich Ubuntu 16.04.2 LTS , verwenden diese Version.

    
davidDavidson 15.10.2015 11:24
31

Am besten verwenden Sie den Link . Die Installation ist einfach über apt-get

    
TheNano 12.03.2013 15:11
22

Der native Fortschrittsstatus wurde zu dd !!! hinzugefügt.

Die neue Version von Coreutils (8.24) fügt dem dd -Tool einen Status hinzu:

Verwendung auf Xubuntu 15.10:

Öffnen Sie ein Terminal und geben Sie die folgenden Befehle ein:

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)

Führen Sie dd als root aus:

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

Sie sehen: Bytes, Sekunden und Geschwindigkeit (Bytes / Sekunde).

So überprüfen Sie die Versionen von dd :

Native:

dd --version

Neu:

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

Wenn Sie dd bereits gestartet haben und wenn Sie eine Datei schreiben, z. B. beim Erstellen einer Kopie eines Pendrive-Laufwerks, können Sie den Befehl watch verwenden, um die Größe der Ausgabedatei ständig zu beobachten, um die Änderungen zu sehen und den Abschluss zu schätzen .

watch ls -l /pathtofile/filename

Nur die Dateigröße anzeigen (h-menschliche Ansicht):

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

Der dd | pv | dd - Dreiklang hat dazu geführt, dass meine 50-GB-VM-Kopie 800 Sekunden dauerte, im Gegensatz zu 260 Sekunden, wenn nur dd verwendet wurde. Zumindest bei dieser Pipeline weiß pv nicht, wie groß die Eingabedatei ist. Sie kann also nicht sagen, wie weit Sie sind. Es gibt also keinen Nachteil, wie folgt zu tun - und Sie haben einen guten Geschwindigkeitsvorteil:

Ich würde Pv auf etwas Großem vermeiden und (bei Verwendung von Bash):

Steuern Sie den Dd-Prozess

bg , um es in den Hintergrund zu stellen. Beachten Sie, dass bg Ihnen eine Ausgabe wie [1] 6011 liefert, wobei die letztere Zahl eine Prozess-ID ist. Also machen Sie:

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

wobei Prozess-ID die Prozess-ID ist, die Sie beobachtet haben. Drücken Sie die Strg-C-Taste, wenn Folgendes angezeigt wird:

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

Sie sind fertig.

Bearbeiten: Silly Systems Administrator! Automatisieren Sie Ihr Leben, arbeiten Sie nicht! Wenn ich einen langen DD-Prozess habe, den ich überwachen möchte, gibt es hier einen Einzeiler, der sich um die gesamte Enchilada kümmert. Dies alles in einer Zeile:

 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

Sie können natürlich ein Skript erstellen, vielleicht $ 1 Ihre Eingabedatei und $ 2 Ihre Ausgabedatei. Dies bleibt dem Leser als Übung überlassen. Beachten Sie, dass Sie vor dem Kill ein wenig Schlaf brauchen, oder der Kill stirbt, wenn Sie versuchen, ein Signal an dd zu senden, wenn es noch nicht bereit ist. Passen Sie Ihren Schlaf wie gewünscht an (vielleicht entfernen Sie sogar den zweiten Schlaf insgesamt).

Bash-FTW! : -)

    
Mike S 06.05.2015 20:32
10

link

Grundsätzlich:

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

Unter Ubuntu 16.04

Ubuntu 16.04 wird mit der dd (coreutils) -Version 8.25 geliefert. Daher ist die Option status=progress unterstützt: -)

Zur Verwendung fügen Sie einfach status=progress zusammen mit Ihrem Befehl dd hinzu.

Beispiel:

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

Gibt den Status als

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

    
Severus Tux 25.06.2016 06:54
6

Am einfachsten ist:

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

oflag=dsync synchronisiert Ihr Schreiben, so dass die Informationen von status=progress genauer sind. Es könnte jedoch etwas langsamer sein.

    
zevero 04.10.2016 08:46
3

Ich habe über dd einen Bash-Wrapper erstellt, der pv verwendet, um den Fortschritt anzuzeigen. Legen Sie es in Ihr .bashrc und verwenden Sie wie gewohnt dd :

# 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

Quelle:

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[@]}"
}
    
midenok 20.10.2014 13:32
3

Ich mag ddrescue wirklich, es funktioniert als dd, gibt aber Ausgabe aus und scheitert nicht an Fehlern. Im Gegenteil, es hat einen sehr fortgeschrittenen Algorithmus und versucht wirklich hart, eine erfolgreiche Kopie zu erstellen ... Es gibt auch viele GUIs für es

Projekt: link

Wikipedia: Link

    
SuperMau 17.02.2016 06:55
3

Verwenden Sie die Option status=progress , um den Fortschritt während der Übertragung abzurufen.

Außerdem zeigt conv=fsync E / A-Fehler an.

Beispiel:

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

Heute war ich etwas frustriert, als ich versuchte, kill in einer Schleife auszuführen, während dd lief, und kam zu dieser Methode, um sie problemlos parallel auszuführen:

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

Jetzt verwenden Sie einfach vdd an einer Stelle, an der Sie normalerweise dd verwenden würden (es werden alle Argumente direkt durchgelassen), und Sie erhalten alle 5 Sekunden einen Fortschrittsbericht.

Der einzige Nachteil ist, dass der Befehl nicht sofort zurückgegeben wird, wenn dd abgeschlossen ist. Daher ist es möglich, dass Sie mit diesem Befehl weitere 5 Sekunden warten können, nachdem dd zurückkehrt, bevor er es bemerkt und beendet.

    
robru 11.04.2014 02:41
1

Wie bereits erwähnt, antwortet es zumindest mit dem 'dd' von GNU coreutils oder busybox auf ein USR1-Signal, indem es Fortschrittsinformationen an stderr druckt.

Ich habe ein kleines Wrapper-Skript für dd geschrieben, das einen hübschen prozentualen Indikator anzeigt und versucht, den Prozess oder die Funktionsweise von dd in keiner Weise zu beeinträchtigen. Sie finden es auf github:

Link

Leider funktioniert dieser SIGUSR1-Trick nur mit GNU dd (aus dem coreutils-Paket) oder dem 'dd'-Modus von busybox, wobei diese spezifische Funktion zur Kompilierzeit aktiviert ist. Es funktioniert nicht mit dem Standard 'dd', das in den meisten BSD-Systemen enthalten ist, einschließlich FreeBSD und OS X ...: (

)     
delt 10.09.2015 08:29
1

Dieser Befehl zwingt dd zur Angabe von Statistiken alle 2 Sekunden. Dies ist die Standardeinstellung für watch:

watch killall -USR1 dd

Um von 2 Sekunden auf alle 5 Sekunden zu wechseln, fügen Sie die Option -n 5 wie folgt hinzu:

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

Mit progress - Coreutils Progress Viewer können Sie den Fortschritt eines jeden coreutils-Programms verfolgen.

Es kann überwacht werden:

cp mv dd tar cat rsync grep fgrep egrep geschnitten sortieren md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma

Sie können die Manpage

sehen

Sie können es in einem separaten Terminalfenster verwenden, während der Befehl ausgeführt wird, oder es mit dem Befehl dd starten:

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

Hier gibt & den ersten Befehl ab und fährt sofort fort, anstatt zu warten, bis der Befehl endet.

Der Fortschrittsbefehl wird mit folgendem Befehl gestartet: -m . Er wartet, bis der überwachte Prozess beendet ist, -p , so dass er eine gegebene PID überwacht, und $! ist der letzte Befehl PID.

Wenn Sie dd mit sudo ausgeben, müssen Sie es auch mit dem Fortschritt tun:

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
    
labsin 22.07.2018 22:06

Tags und Links