Jam*_*mes 765 monitoring dd
dd真是个奇迹。它允许您将一个硬盘驱动器复制到另一个硬盘驱动器,将一个硬盘驱动器完全归零等。但是一旦您启动一个dd命令,就没有任何东西可以告诉您它的进度。它只是停留在光标处,直到命令最终完成。那么如何监控dd的进度呢?
pho*_*bos 865
2016 年更新:如果您使用 GNU coreutils >= 8.24(Ubuntu Xenial 16.04 以上的默认版本),请参阅下面的方法 2 以获取显示进度的替代方法。
pv安装pv并将其放在仅输入/输出dd命令之间。
注意:当你已经开始时你不能使用它dd。
从包描述:
pv- 管道查看器 - 是一种基于终端的工具,用于通过管道监控数据的进度。它可以插入到两个进程之间的任何正常管道中,以直观地指示数据通过的速度、花费的时间、距离完成的程度以及完成之前的估计时间。
安装
sudo apt-get install pv
Run Code Online (Sandbox Code Playgroud)
例子
dd if=/dev/urandom | pv | dd of=/dev/null
Run Code Online (Sandbox Code Playgroud)
输出
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
Run Code Online (Sandbox Code Playgroud)
--size如果需要时间估计,可以使用 指定近似大小。
示例 假设从 /dev/sdb 复制 2GB 磁盘
命令没有pv将是:
sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
Run Code Online (Sandbox Code Playgroud)
命令pv:
sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
Run Code Online (Sandbox Code Playgroud)
输出:
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19
Run Code Online (Sandbox Code Playgroud)
其他用途
您当然可以pv直接使用将输出通过管道传输到 stdout:
pv /home/user/bigfile.iso | md5sum
Run Code Online (Sandbox Code Playgroud)
输出
50,2MB 0:00:06 [8,66MB/s] [=======> ] 49% ETA 0:00:06
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,会pv自动识别尺寸。
status添加到dd(GNU Coreutils 8.24+)的新选项dd在 GNU Coreutils 8.24+(Ubuntu 16.04 及更高版本)中,有一个新status选项来显示进度:
dd if=/dev/urandom of=/dev/null status=progress
Run Code Online (Sandbox Code Playgroud)
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
Run Code Online (Sandbox Code Playgroud)
Jam*_*mes 532
您可以dd通过使用kill命令向进程发送信号来监视它运行后的进度,而无需停止它。
启动后dd,打开另一个终端,然后输入任一:
sudo kill -USR1 $(pgrep ^dd$)
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用的是 BSD 或 OS X:
sudo kill -INFO $(pgrep ^dd$)
Run Code Online (Sandbox Code Playgroud)
这将在dd终端窗口中显示进度,而不会停止进程(通过打印到其 stderr 流)。例如:
# dd if=/dev/urandom of=rando bs=1024 count=1048576
335822+0 records in
335821+0 records out
343880704 bytes (344 MB, 328 MiB) copied, 6.85661 s, 50.2 MB/s
Run Code Online (Sandbox Code Playgroud)
如果您想获得dd进度的定期更新,请输入:
watch -n5 'sudo kill -USR1 $(pgrep ^dd$)'
Run Code Online (Sandbox Code Playgroud)
watch将dd每 -n 秒(-n5= 5 秒)探测该进程并报告而不停止它。
注意上面命令中正确的单引号。
小智 115
一些方便的示例用法,pv与其他答案相比,打字次数更少或进步更多:
首先,您需要pv使用以下命令安装:
sudo apt-get install pv
Run Code Online (Sandbox Code Playgroud)
那么一些例子是:
pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
Run Code Online (Sandbox Code Playgroud)
注意:第一个示例比输入少 5 个字符dd if=/dev/urandom | pv | dd of=/dev/null。
我最喜欢克隆磁盘驱动器(用驱动器号替换 X):
(pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
Run Code Online (Sandbox Code Playgroud)

来源:http : //www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/
也用于存档我自己。
小智 71
使用Ctrl+ Shift+ T,同时dd在运行,它会输出的进度(以字节为单位):
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)
Run Code Online (Sandbox Code Playgroud)
The*_*ano 37
最好是使用http://dcfldd.sourceforge.net/很容易通过 apt-get 安装
use*_*963 30
本机进度状态已添加到 dd 中!!!
新版 Coreutils (8.24) 为dd工具添加了进度状态:
在 Xubuntu 15.10 上的用法:
打开终端并键入以下命令:
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)
Run Code Online (Sandbox Code Playgroud)
dd以 root 身份运行:
sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
Run Code Online (Sandbox Code Playgroud)
您将看到:字节、秒和速度(字节/秒)。
要检查 的版本dd:
本国的:
dd --version
Run Code Online (Sandbox Code Playgroud)
新的:
cd coreutils-8.24/src
./dd --version
Run Code Online (Sandbox Code Playgroud)
fab*_*or4 19
如果你已经启动了 dd,并且你正在写一个文件,比如在创建一个 pendrive 的副本到磁盘时,你可以使用 watch 命令不断观察输出文件的大小,以查看变化并估计完成情况。
watch ls -l /pathtofile/filename
Run Code Online (Sandbox Code Playgroud)
仅查看文件大小(人类视角):
watch ls -sh /pathtofile/filename
Run Code Online (Sandbox Code Playgroud)
Mik*_*e S 13
该dd | pv | dd黑社会让我的50GB的VM复制需要800秒,而不是仅仅使用DD 260秒。使用这个管道,至少 pv 不知道输入文件有多大,所以它无法告诉你你走了多远,所以按以下方式做没有任何缺点 - 你会得到一个很好的速度优势:
我会避免在任何大的东西上使用 pv,并且(如果使用 Bash):
Control-Z dd 进程
bg把它放在背景中。观察这bg会给你输出,比如[1] 6011后面的数字是进程 ID。所以,做:
while true; do kill -USR1 process_id ; sleep 5; done
其中 process_id 是您观察到的进程 ID。当您看到以下内容时按 Control-C:
[1]+ Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process
Run Code Online (Sandbox Code Playgroud)
你完成了。
编辑:愚蠢的系统管理员!自动化你的生活,不要工作!如果我有一个很长的 dd 过程要监控,这里有一个单行程序可以为您处理整个辣酱玉米饼馅;把这一切放在一行上:
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
Run Code Online (Sandbox Code Playgroud)
当然,您可以编写脚本,也许将 $1 设为输入文件,将 $2 设为输出文件。这留给读者作为练习。请注意,在杀死之前您需要一点睡眠,否则杀死可能会在它尚未准备好时尝试向 dd 发送信号而死亡。根据需要调整您的睡眠(甚至可能完全取消第二次睡眠)。
Bash-FTW!:-)
hna*_*rat 12
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
基本上:
kill -USR1 < dd pid >
Run Code Online (Sandbox Code Playgroud)
Sev*_*Tux 10
Ubuntu 16.04 附带 dd (coreutils) 版本8.25。因此,选项status=progress 是支持:-)
要使用它,只需添加status=progress您的dd命令。
例子 :
dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync
Run Code Online (Sandbox Code Playgroud)
给出状态为
1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s
Run Code Online (Sandbox Code Playgroud)
小智 8
dd if=... of=... bs=4M status=progress oflag=dsync
Run Code Online (Sandbox Code Playgroud)
oflag=dsync将使您的写作保持同步,因此信息status=progress更准确。不过可能会慢一些。
使用选项status=progress获取传输过程中的进度。
此外,conv=fsync还会显示 I/O 错误。
例子:
sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
Run Code Online (Sandbox Code Playgroud)
这迫使 dd 每 2 秒提供一次统计数据,这是 watch 的默认值:
watch killall -USR1 dd
Run Code Online (Sandbox Code Playgroud)
要将每 2 秒更改为每 5 秒,请添加 -n 5 选项,如下所示:
watch -n 5 killall -USR1 dd
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢 ddrescue,它的工作原理与 dd 一样,但会提供输出并且不会因错误而失败,相反,它有一个非常先进的算法,并且非常努力地尝试成功复制...还有很多 GUI
项目: https: //www.gnu.org/software/ddrescue
维基百科: https: //en.wikipedia.org/wiki/Ddrescue