查看另一个 pts 的标准输出

mul*_*sen 24 process terminal io-redirection rsync

这是情况。我把我的电脑留在家里,从 2TB 硬盘驱动器到另一个 2TB 硬盘驱动器进行 rsync(这需要一段时间,因为它们都是 USB 2.0)。我现在正在工作,并且已通过 ssh 连接到我的家用电脑。如果我这样做,ps aux | grep rsync我可以看到以下内容:

1000  7214 18.8  0.1  30636  1368 pts/0 S+   00:52 134:00 rsync -vr /media/master /media/slave
Run Code Online (Sandbox Code Playgroud)

但是我想看看 rsync 到底在做什么。当我在家时,标准输出显示在我的终端中,rsync 的详细模式显示当前正在复制哪些文件。有没有办法读取另一个pts的stdout?

$ ps -t pts/0
7214 pts/0    02:14:42 rsync
Run Code Online (Sandbox Code Playgroud)

我做了一点谷歌搜索,似乎/proc/pid/fd可以找到答案,但我不确定这一点......

PS我当然有sudo权限。

Joh*_*ess 20

运行gdb -p 7214,然后执行:

p dup2(open("/dev/pts/your-pts-number", 1), 1)
detach
quit
Run Code Online (Sandbox Code Playgroud)

这不是很明显,但它将标准输出从您附加到的进程重定向到第一行中给出的路径(在这种情况下,您需要的点)。


Ran*_*832 13

strace的工具可以让你得到的输出去一个特定的文件描述符的副本(在这种情况下,输出和错误)。

strace -e write=1,2 -e trace=write -p 7214
Run Code Online (Sandbox Code Playgroud)

这将以十六进制转储格式出现。


Gil*_*il' 6

您可以将rsync进程与其终端分离并将其移动到当前终端。请参阅如何将其否认为正在运行的进程并将其关联到新的屏幕外壳?. 基本方法类似于John Flatness 的回答中的 gdb 命令,但neercsretty等工具更强大。

确保将进程导入 screen 或 tmux 会话,这样您就不必再次分离它(除非您使用 neercs,它已经提供了此功能)。

另一种方法是通过查看进程打开了哪些文件来检查进程现在正在做什么。lsof会告诉你。

lsof -p7214
Run Code Online (Sandbox Code Playgroud)