如何监控dd的进度?

dd 真是个奇迹。 它可以让你复制一个硬盘驱动器到另一个,完全零硬盘驱动器等。 但一旦你启动了一个 dd 命令,没有什么可以告诉你它的进展。 它只是坐在光标处,直到命令最终完成。 那么如何监控dd的进展呢?

更新2016>:如果您使用GNU coreutils=8.24(Ubuntu Xenial16.04向上的默认值),请参阅下面的方法2以获取显示进度的替代方法。


方法1:通过使用 pv

安装/安装 pv 并将其放在输入/输出之间 dd 命令。

注意事项:你不能使用它,当你已经开始 dd.

包装说明:

pv -管道查看器-是一个基于终端的工具,用于通过管道监控数据的进度。 它可以插入到两个进程之间的任何正常管道中,以直观地显示数据传递的速度、需要多长时间、距离完成有多近,以及估计到完成需要多长时间。

安装工程

sudo apt-get install pv

例子:

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

输出

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

您可以使用 --size 如果你想要一个时间估计。


示例假设从/dev/sdb复制2GB磁盘

命令没有 pv 会是:

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

命令与 pv:

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

输出:

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

其他用途

你当然可以使用 pv 直接将输出通过管道传输到stdout:

pv /home/user/bigfile.iso | md5sum

输出

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

请注意,在这种情况下, pv 自动识别大小。


方法2:新 status 选项添加到 dd (GNU Coreutils8.24+)

dd 在GNU Coreutils8.24+(Ubuntu16.04及更新版本)中得到了一个新的 status 显示进度的选项:

例子:

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

输出

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

如何:监察dd的进度

你可以监察 dd 一旦它运行而没有停止它使用 kill 命令向进程发送信号。

开始后 dd,打开另一个终端并输入 要么:

sudo kill -USR1 $(pgrep ^dd$)

,如果你在BSD或OS X:

sudo kill -INFO $(pgrep ^dd$)

这将显示在 dd 终端窗口,而不会停止过程(通过打印到其stderr流)。 例如:

# dd if=/dev/urandom of=rando bs=1024 count=1048576335822+0 records in335821+0 records out343880704 bytes (344 MB, 328 MiB) copied, 6.85661 s, 50.2 MB/s

如你想定期更新 dd 进度,然后进入:

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

watch 将探测 dd 处理每-n秒(-n5 =5秒)并在没有停止的情况下报告。

请注意上面命令中的正确单引号。

一些方便的示例用法 pv 和更少的打字或更多的进展,然后其他答案:

首先,您需要安装 pv,用命令:

sudo apt-get install pv

然后一些例子是:

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

注意:第一个示例是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

screenshot

资料来源: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

也是为了自己存档。

为了完整起见:

版本 8.24GNU coreutils 包括dd的补丁,引入一个参数来打印进度。

承诺 介绍这一变化有评论:

dd:新 状态=进度 定期打印统计信息

许多发行版,包括 Ubuntu16.04.2LTS 使用此版本。

使用方法 Ctrl+Shift+Tdd 正在运行,它将输出进度(以字节为单位):

load: 1.51  cmd: dd 31215 uninterruptible 0.28u 3.67s321121+0 records in321120+0 records out164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)

最好的是使用 http://dcfldd.sourceforge.net/ 它很容易通过apt-get安装

本机进度状态被添加到dd!!!

新版本的Coreutils(8.24)将进度状态添加到 dd 工具:

Xubuntu15.10上的用法:

打开终端并键入以下命令:

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

dd 作为根:

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

您将看到:字节,秒和速度(字节/秒)。

要检查的版本 dd:

土着人:

dd --version

新的:

cd coreutils-8.24/src./dd --version

如果您已经启动了dd,并且正在编写文件,例如在创建pendrive到磁盘的副本时,您可以使用watch命令不断观察输出文件的大小以查看更改并估计完成情况。

watch ls -l /pathtofile/filename

只查看档案大小(h-人类视图):

watch ls -sh /pathtofile/filename

dd | pv | dd triad使我的50gb vm副本需要800秒,而不是仅使用dd的260秒。 通过这个管道,至少,pv不知道输入文件有多大,所以它不能告诉你你有多远,所以这样做没有缺点-而且你会得到一个很好的速度优势:

我会避免pv在任何大的东西上,并且(如果使用Bash):

控制-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

你玩完了。

编辑:愚蠢的系统管理员! 自动化你的生活,不要工作! 如果我有一个很长的dd过程,我想监控,这里有一个单行,将为你照顾整个enchilada;把这一切放在一条线上:

 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

当然,您可以编写脚本,也许将input1作为输入文件,将output2作为输出文件。 这是留给读者的练习。 请注意,在杀死之前你需要一点睡眠,或者杀死可能会在dd还没有准备好的时候试图向dd发送信号。 根据需要调整你的睡眠(甚至可能完全取消第二次睡眠)。

Bash-FTW! :-)

http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html

基本上:

kill -USR1 < dd pid >