我怎么知道 dd 是否仍在工作?

eck*_*kza 153 osx file-transfer dd hard-disk

我还没有使用dd那么多,但到目前为止它还没有让我失望。现在,我已经dd进行了 12 多个小时 - 我正在将图像写回它来自的磁盘 - 我有点担心,因为我能够dd从磁盘到图像大约7小时。

我在配备 Core 2 Duo 的 MacBook 上运行 OSX 10.6.6,频率为 2.1ghz/core,内存为 4gb。我正在从 7200rpm 硬盘驱动器(引导驱动器)上的 .dmg 中读取数据,并且正在写入通过 SATA-to-USB 连接器连接的 7200rpm 驱动器。我默认保留了块大小,图像大约为 160GB。

编辑:而且,经过 14 小时的纯压力,dd毕竟工作得很好。不过,下一次,我将运行它pv并使用strace. 感谢大家的帮助。

Cal*_*leb 181

您可以dd使用该kill命令发送某个信号,使其输出当前状态。信号INFO在 BSD 系统(包括 OSX)和USR1Linux 上。在你的情况下:

kill -INFO $PID
Run Code Online (Sandbox Code Playgroud)

您可以$PID使用ps命令找到进程ID(上面);或者在 mac os x 上查看pgrep 和 pkill 替代品以获得更方便的方法。

更简单地说,正如AntoineG他的回答中指出的那样,您可以ctrl-T在运行 dd 的 shell 中键入以向其发送INFO信号。

作为 Linux 上的示例,您可以使所有活动dd进程输出状态如下:

pkill -USR1 -x dd
Run Code Online (Sandbox Code Playgroud)

输出其状态后,dd将继续应对。

  • dd USR1 信号_太快_在它启动后(即在 bash 脚本中,你启动它之后的那一行)实际上会终止它。在两者之间放置 0.1 秒的睡眠,它将正确输出其进度。顺便说一下,一个非常好的测试 USR1/INFO 的 dd 命令是`dd if=/dev/zero of=/dev/null`。:) (11认同)
  • 顺便说一句,如果状态字符(默认情况下为 Ctrl+T)发送到终端,所有“真正的”BSD 都会将 SIGINFO 发送到前台进程组。但我不知道 MacOSX 是否如此。 (11认同)
  • 哦,很酷。您可以将它们与 `pkill -USR1 -x dd` 结合使用 (10认同)
  • @kivetros:在 BSD 系统上,您需要发送 `INFO` 信号。Linux 没有 SIGINFO,而是使用 `USR1`。 (9认同)
  • SIGUSRx 信号用于程序做他们想做的事情,而不是具有标准化的含义。例如,SIGWINCH 会在终端更改其大小并且程序可能需要重绘其屏幕时引发。操作系统不发送 SIGUSRx,因此它们可用于自定义用途。 (5认同)
  • `CTRL+T` 做得很好。 (4认同)
  • 我的 Ubuntu 盒子说使用 `$ kill -s INFO $pid; 等待 $pid`。“在缺少 'INFO' 信号的系统上,'dd' 会响应 'USR1' 信号,除非设置了 'POSIXLY_CORRECT' 环境变量。” (3认同)
  • 不,它肯定会停止进程并吐出“用户定义的信号 1”。好在我尝试了一些无关紧要的东西。:P (2认同)
  • @Gilles 感谢您在 BSD 上追踪不同的信号。 (2认同)

小智 107

在OS X(在Linux上没有尝试),你可以简单地输入Ctrl+T终端运行dd。它将打印与 相同的输出kill -INFO $PID,加上 CPU 使用率:

load: 1.40  cmd: dd 34536 uninterruptible 3.49u 64.58s
5020305+0 records in
5020304+0 records out
2570395648 bytes transferred in 4284.349974 secs (599950 bytes/sec)
Run Code Online (Sandbox Code Playgroud)

我在阅读此线程时发现了它,并尝试在我的终端中打开一个新选项卡,但将?+TCtrl+混合T

  • 我在 Linux 上尝试了 dd ,它只是将 `^T` 回显到终端。 (2认同)

Gil*_*il' 27

对于dd,您可以发送信号。对于正在读取或写入文件的其他命令,您可以使用lsof.

lsof -o -p1234    # where 1234 is the process ID of the command
lsof -o /path/to/file
Run Code Online (Sandbox Code Playgroud)

如果您提前计划,请将数据通过pv.


jof*_*fel 17

更通用的方法是使用iotop它显示每个程序的当前磁盘读取/写入量。

编辑:iotop -o仅显示执行当前 I/O 操作的程序(感谢Jason C的评论)。


phi*_*lfr 13

我通常会附加strace到这样一个正在运行的进程(带有-p $PID选项),以查看它是否在系统调用中保持阻塞状态,或者它是否仍然处于活动状态。

或者,如果您对向正在运行的 dd 发送信号感到紧张,请启动另一个 dd 以验证它是否有效。

  • 你究竟会如何附加`strace`?此外,我确实启动了另一个 `dd` 并向它发送了一个建议的信号,然后......它杀死了它。 (2认同)
  • 如果您知道正在运行的 dd 进程的 pid,只需执行 strace -p <pid>。您应该看到进程调用的所有系统调用的日志(主要是读和写) (2认同)

Chi*_*g64 13

coreutilsv8.24 开始,dd原生支持显示进度。只需添加选项status=progress

例子:

dd if=arch.iso of=/dev/sdb bs=4M status=progress
Run Code Online (Sandbox Code Playgroud)

来源


Jas*_*n C 11

下次,您可以pv从头开始使用(如果它可以通过您的包管理器使用,请安装它)。这是一个实用程序,其唯一目的是将输入管道输出到输出并监控进度和速度。

然后,为了将图像写入驱动器,假设块大小为 4MB:

pv -ptearb /path/to/image.bin | dd iflag=fullblock of=/dev/whatever bs=4M
Run Code Online (Sandbox Code Playgroud)

除了初始缓冲(由最终同步偏移,dd如果您愿意,可以通过它完成),这将显示进度条、平均速度、当前速度和预计到达时间。

iflag=fullblock选项强制 dd 通过 获取完整的输入块pv,否则您将受管的块大小支配。

相反,使用 dd 读取,使用 pv 写入,但如果源是块设备,则必须明确指定大小。对于 4GB 设备:

dd if=/dev/whatever bs=4M | pv -ptearb -s 4096m > /path/to/image.bin
Run Code Online (Sandbox Code Playgroud)

您还可以自动确定大小,例如:

dd if=/dev/whatever bs=4M | pv -ptearb -s `blockdev --getsize64 /dev/whatever` > /path/to/image.bin
Run Code Online (Sandbox Code Playgroud)

无论您按什么顺序执行操作dd和顺序都没有关系pv,这完全与性能相关——如果您正在读取或读取的设备对于您想要使用dd而不是pv访问该设备的某些块大小具有最佳性能。dd如果您愿意,您甚至可以在两端粘贴 a ,如果您不在乎,则根本不粘贴:

pv -ptearb /path/to/image.bin > /dev/whatever
sync
Run Code Online (Sandbox Code Playgroud)


小智 5

ddrescue 将在运行时为您提供统计信息。

演示:http : //www.youtube.com/watch?v= vqq9A01geeA#t= 144s

  • 这对下一次可能会有帮助,但它不会帮助 OP 了解当前命令是否被冻结。 (3认同)