在CentOS这类服务器操作系统中,dd命令是一个功能极其强大但同样充满风险的工具,它常用于底层磁盘操作,如备份整个硬盘(dd if=/dev/sda of=/backup.img)、创建启动盘或擦除磁盘数据。dd命令的一个显著特点是,在执行时默认不会显示任何进度信息,对于耗时数小时甚至更久的操作,这无疑会让系统管理员感到焦虑,掌握如何有效查看dd进程的进度,是每一位CentOS用户必备的技能,本文将系统地介绍几种在CentOS上查看和监控dd进程的实用方法,从传统技巧到现代解决方案,并分析各自的优劣。

使用kill命令发送信号查看进度
这是最经典、兼容性最广的方法,适用于几乎所有版本的Linux系统,包括较旧的CentOS发行版,其原理是向正在运行的dd进程发送一个USR1(User Signal 1)信号,dd在接收到这个信号后,会将其当前的I/O统计信息打印到其标准错误输出(stderr)。
操作步骤如下:
打开一个新的终端窗口,使用ps命令结合grep来查找dd进程。dd进程会以root权限运行。ps aux | grep dd
你可能会看到类似下面的输出,第二列的数字就是PID。
root 1234 0.5 0.1 123456 7890 pts/0 S+ 10:30 0:15 dd if=/dev/sda of=/mnt/backup/sda.img bs=4M在这个例子中,PID是
1234。
使用kill命令配合找到的PID,发送USR1信号,这里的kill并非“杀死”进程,而仅仅是发送一个信号。sudo kill -USR1 1234
由于
dd进程通常由root用户启动,普通用户可能需要使用sudo来获取发送信号的权限。查看进度信息。
执行完kill命令后,切换回运行dd命令的那个原始终端窗口,你会看到类似以下的输出被打印出来:12345678+0 records in 12345678+0 records out 5187631042560 bytes (5.2 TB) copied, 7200 s, 720.1 MB/s这行信息清晰地显示了已复制的数据量、已用时间和当前的平均速度,你可以重复执行
kill -USR1 <PID>命令来获取最新的进度。
优点:
- 兼容性极好,几乎适用于所有Linux系统。
- 不需要额外安装任何软件。
缺点:

- 操作繁琐,需要手动查找PID并发送信号。
- 进度信息是一次性的,不会持续更新。
- 如果启动
dd的终端已经关闭(通过nohup或screen运行),则无法看到输出。
使用status=progress参数实现实时进度
从GNU Coreutils 8.24版本开始(CentOS 7/8通常都已包含或可升级到此版本),dd命令内置了一个非常方便的status=progress选项,这是目前最推荐、最简单的方法。
操作步骤如下:
在执行dd命令时,直接在命令末尾添加status=progress参数。
sudo dd if=/dev/sda of=/mnt/backup/sda.img bs=4M status=progress
效果:
一旦执行,dd就会在终端上持续显示一行动态更新的进度信息,格式如下:
5187631042560 bytes (5.2 TB, 4.7 TiB) copied, 7200 s, 720.1 MB/s 这行信息会实时刷新,让你对任务状态一目了然,无需任何额外操作。
优点:
- 极其简单,一行命令搞定。
- 实时、持续更新,体验极佳。
- 无需查找PID或打开新终端。
缺点:
- 依赖于较新版本的
dd,在非常古老的系统上可能不可用。 - 必须在启动
dd命令时就指定该参数,无法对已经启动的dd进程生效。
使用pv(Pipe Viewer)工具监控数据流
pv(Pipe Viewer)是一个专门用于监控通过管道数据流的工具,它可以为任何命令添加一个强大的进度条,它遵循Unix哲学,专注于一件事并将其做到极致,对于dd任务,pv可以提供比status=progress更丰富的信息,包括预计剩余时间(ETA)。
操作步骤如下:
在CentOS上,可以使用yum或dnf来安装。# For CentOS 7 sudo yum install pv # For CentOS 8/9/Stream sudo dnf install pv
将pv插入到数据流中。pv会读取输入源,显示进度,然后将数据传递给dd进行写入。
sudo pv /dev/sda | dd of=/mnt/backup/sda.img bs=4M
效果:pv会输出一个非常直观的进度条和统计信息:
2TiB 0:12:00 [720MiB/s] [=====================> ] 75% ETA 0:04:00 这个输出包含了总量、已用时间、当前速度、进度百分比和预计完成时间,信息非常全面。
优点:
- 提供最丰富的进度信息,包括ETA。
- 通用性强,可以用于监控任何通过管道的数据传输,不仅仅是
dd。 - 界面友好,可读性高。
缺点:
- 需要额外安装软件。
- 命令语法比直接使用
dd稍复杂。
方法对比与选择
为了更清晰地选择合适的方法,下表对三种方法进行了小编总结:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
kill -USR1 | 兼容性最强,无需安装 | 操作繁琐,非实时,可能无法查看输出 | 在无法安装新软件的古老系统上,或为已启动的dd进程查看进度 |
status=progress | 内置功能,实时更新,操作简单 | 依赖较新版本,无法用于已启动的进程 | 在现代CentOS系统上启动新的dd任务时的首选方案 |
pv | 信息最全(含ETA),通用性好 | 需额外安装,命令稍复杂 | 需要详细监控信息,或监控其他管道数据流时 |
相关问答FAQs
问题1:为什么我的 dd 命令在使用 status=progress 参数后没有显示任何进度信息?
解答: 这通常有两个主要原因,第一,您的系统dd版本过旧,不支持该参数,您可以通过运行 dd --version 命令来检查版本,如果低于8.24,则不支持,第二,您可能将dd的输出重定向了,进度信息是输出到标准错误(stderr)的,如果您使用了类似 dd ... > /dev/null 2>&1 这样的命令,stderr也被重定向到了/dev/null,自然就看不到进度了,请确保在终端中直接运行命令,或者只重定向标准输出(stdout),dd ... 1> output.log。
问题2:如果我忘记了 dd 进程的 PID,但又不想用 ps aux | grep dd 在一堆进程里“大海捞针”,有没有更精准的方法?
解答: 有的,您可以使用 pgrep 或 pidof 命令,它们是专门用于查找进程PID的工具,比 ps | grep 更简洁、更可靠。
pgrep dd:这个命令会直接列出所有名为dd的进程的PID,每行一个。pidof dd:这个命令更简单,它会直接返回第一个找到的dd进程的PID,如果只有一个dd进程在运行,这个命令非常高效。
这两个命令都可以直接与kill结合使用,sudo kill -USR1 $(pgrep dd),这样就可以一步到位地向所有dd进程发送信号,无需手动复制粘贴PID。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复