远程监控 DD 的状态

远程监控 DD 的状态

dd在本地控制台上的 Debian 系统上运行了一个很长的进程。

我知道我可以CTRL+T在本地控制台上发送 USER1 或,但目前我唯一的方法是通过 进行监控ssh。不幸的是,Google 在这里没有提供任何帮助。

有没有一种简单的方法可以远程监控其进度而无需停止当前任务?

答案1

pv

pv可以观察另一个进程。相关部分man 1 pv

-d PID[:FD]--watchfd PID[:FD]

不传输数据,而是观察FD进程的文件描述符PID并显示其进度。当更改为其他文件、更改读/写模式或关闭时,pv进程将退出;其他数据传输修饰符(和远程控制)不能与此选项一起使用。FD

如果仅指定 a PID,则将监视该进程,并且将使用进度条显示其打开的所有常规文件和块设备。pv进程PID退出时,该进程也将退出。

但也有限制:

  • 这仅适用于常规文件和块设备。如果您dd位于管道中间,pv -d则不会监视其 stdin 或 stdout。进度条在这种情况下毫无意义,但您可能仍想查看吞吐量。但即使您明确指定PID:0PID:1,这也不起作用。
  • 通常情况下,作为普通用户,您无法查看其他用户的进程。

dd这种方法的优点是完全不具侵入性。它不会以任何方式影响运行。


reptyr

另一种方法是使用reptyr;参见我的这个答案

启动screentmux使用reptyr将正在运行的附加dd到新终端。如果成功,您将能够dd在新终端中看到对信号的反应。如果需要,请从screen/分离并重新连接。tmux

笔记:

  • dd对信号的反应将不再出现在旧终端中。
  • reptyr将重定向相关文件描述符并更改 的控制终端dd;因此这在某种程度上是侵入性的。我的建议是尝试使用“抓猴子 dd“ 第一的。
  • 在某些情况下(例如dd在管道中)reptyr无法连接。然后reptyr -T可能会起作用,但它会影响其他进程,而不仅仅是dd。请参阅man 1 reptyr了解详情。

答案2

现在长dd命令正在运行,重定向其输出已经太晚了。也许你离控制台很远,无法使用screen或者为其创建 FIFO标准错误...

...但你仍然可以使用远程控制会话和strace

在第一个 ssh 会话中你可以写入

sudo strace -ewrite -p `pgrep ^dd`  2>&1 | grep -v "write(1,"

第二个则相反(阅读下面的警告说明为要使用的信号-SIGUSR1SIGINFO

kill -USR1 $(pgrep ^dd)

一开始的输出不太好,类似于下面的输出

Process 26176 attached
--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=29517, si_uid=0} ---
write(2, "329094980+0 records in\n329094979"..., 47) = 47
write(2, "168496629248 bytes (168 GB) copi"..., 34) = 34
write(2, ", 109.221 s, 1.5 GB/s\n", 22) = 22

笔记:不幸的是(即使报告不同),该命令kill -USR1 $(pgrep ^dd)将强制正在运行的dd进程写入其原始 stderr。为此,需要修改原始答案(您可以在版本历史记录中看到)。
警告:据报道另一个答案使用 kill 而不是 发送的信号-USR1可能取决于 Linux 发行版。在 -SIGINFOUbuntu 下的OpenBSD 下SIGUSR1提前仔细检查,错误就会终止该进程!

相关内容