我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:0
或PID:1
,这也不起作用。 - 通常情况下,作为普通用户,您无法查看其他用户的进程。
dd
这种方法的优点是完全不具侵入性。它不会以任何方式影响运行。
和reptyr
另一种方法是使用reptyr
;参见我的这个答案。
启动screen
或tmux
使用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,"
第二个则相反(阅读下面的警告说明为要使用的信号-SIGUSR1
或SIGINFO
)
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 发行版。在 -SIGINFO
Ubuntu 下的OpenBSD 下SIGUSR1
。提前仔细检查,错误就会终止该进程!