查看另一个点的标准输出

查看另一个点的标准输出

情况是这样的。我把我的电脑留在家里,从一个 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

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

$ ps -t pts/0
7214 pts/0    02:14:42 rsync

我做了一些谷歌搜索,似乎/proc/pid/fd可能有答案,但我对此不确定......

PS我当然有sudo权限。

答案1

运行gdb -p 7214,并执行以下操作:

p dup2(open("/dev/pts/your-pts-number", 1), 1)
detach
quit

这并不完全明显,但它将标准输出从您附加的进程重定向到第一行中给出的路径(在本例中是您想要的点)。

答案2

斯特雷斯该工具允许您获取发送到特定文件描述符(在本例中为 stdout 和 stderr)的输出的副本。

strace -e write=1,2 -e trace=write -p 7214

这将以十六进制转储格式显示。

答案3

您可以将该rsync进程与其终端分离并将其移至当前终端。看我怎样才能否认它是一个正在运行的进程并将其关联到一个新的屏幕外壳?。基本方法类似于John Flatness 的回答中的 gdb 命令,但是诸如尼尔克斯雷蒂更加稳健。

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

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

lsof -p7214

答案4

在 BSD 中检查watch命令。

否则请检查以下示例strace7214您的 PID 是哪里):

strace -e trace=write -s1000 -fp 7214 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

如需进一步说明或更多示例,请检查:如何在另一个 bash 会话中查看正在运行的进程的输出?

相关内容