![有没有一种方法可以获取 Linux 中 DD 的百分比?](https://linux22.com/image/1552177/%E6%9C%89%E6%B2%A1%E6%9C%89%E4%B8%80%E7%A7%8D%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E8%8E%B7%E5%8F%96%20Linux%20%E4%B8%AD%20DD%20%E7%9A%84%E7%99%BE%E5%88%86%E6%AF%94%EF%BC%9F.png)
事情是这样的。
我通过 Linux Live USB 启动了服务器上驱动器的备份。我开始使用命令dd
vanilla; just复制第一个驱动器sudo dd if=/dev/sda of=/dev/sdc1
,然后我记起这只会让控制台空白,直到它完成。
无论如何,我需要对同一个驱动器运行不同的备份,因此我也启动了那个备份,sudo dd if=/dev/sdb of=/dev/sdc3 status=progress
然后我得到了一行文本,显示当前传输速率以及字节数的进度。
我希望有一种方法可以显示备份的百分比,而不是计算 1.8TB 中备份了多少字节。有没有比 status=progress 更简单的方法?
答案1
查看此问题的答案[1]
pv
例如你可以使用pv
在你开始之前
sudo apt-get install pv # if you do not have it
pv < /dev/sda > /dev/sc3 # it is reported to be faster
pv /dev/sda > /dev/sc3 # it seems to have the same speed of the previous one
#or
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3 # Maybe slower
输出[2]:
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19
笔记:
尤其是对于大文件,您可能希望查看man dd
并设置加速硬件所需的选项,例如bs=100M
设置缓冲区、oflag=sync
计算写入的有效字节数,也许direct
......
该选项-s
仅接受整数参数1.8T-->1844G
。
从第一行就可以注意到,您dd
根本不需要。
kill -USR1 pid
如果你已经启动命令dd
,一旦你确定了它的 PID(Ctrl- Z+bg
并且你读到了,或pgrep ^dd
...),你可以发送一个信号USR1
(或SIGUSR1
,或SIGINFO
见下文)并读取输出。
如果程序的 PID 是 1234,
kill -USR1 1234
dd
将在 STDERR 终端上回答类似以下内容
4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s
警告:在OpenBSD下,你可能需要提前检查kill
[3] : 改用
kill -SIGINFO 1234
。
它存在名为 的 sigaction SIGINFO
。SIGUSR1
在本例中,应该终止该程序(dd
)...
在 Ubuntu 下使用-SIGUSR1
(10
)。
答案2
我处理这类事情的首选工具是progress
:
这个工具可以描述为微小的, Dirty, Linux-and-OSX-Only C 命令,用于查找当前在系统上运行的 coreutils 基本命令(cp、mv、dd、tar、gzip/gunzip、cat 等)并显示 百分比复制的数据。它还可以显示预计时间和吞吐量,并提供了“类top”模式(监控)。
它只是扫描
/proc
有趣的命令,然后查看目录fd
并fdinfo
查找打开的文件并寻找位置,并报告最大文件的状态。它非常轻,并且几乎与任何命令兼容。
我发现它特别有用,因为:
pv
与管道或相比dcfldd
,我不必记住在启动操作时运行不同的命令,我可以在事后监控内容;- 与 相比
kill -USR1
,它几乎适用于任何命令,我不必总是仔细检查手册页以确保我没有意外地终止副本;而且,当不带参数调用时,它会显示当前正在运行的任何常见“数据传输”命令的进度,所以我甚至不必查找 PID,这一点很好; - 与之相比
pv -d
,我不再需要查找 PID。
答案3
运行dd
,然后在单独的 shell 中调用以下命令:
pv -d $(pidof dd) # root may be required
这将使 pv 获取进程所有打开的文件描述符的统计信息dd
。它将向您显示读取和写入缓冲区所在的位置。
答案4
以百分比形式计算,你需要做一些数学运算,但你可以以人类可读的形式获取 dd 的进度,即使在已经开始之后,也可以通过以下方式获取kill -USR1 $(pidof dd)
当前 dd 进程将显示类似以下内容:
已复制 11117279 字节(11 MB,11 MiB),13.715 秒,811 kB/s