如何将正在运行的进程输出从管道重定向到其他内容?

如何将正在运行的进程输出从管道重定向到其他内容?

有没有什么方法可以将 stdout (1) 从该“管道”重定向到(我不知道我到底如何解释这一点,如果有人可以解释如何处理这一点,或者给我一些关于这一点的阅读,我会很高兴)一些其他输出,例如。文件或终端?

-bash-4.2$ ls -l /proc/11/fd
total 0
lrwx------ 1 us sudo 64 Sep 24 11:26 0 -> /dev/null
l-wx------ 1 us sudo 64 Sep 24 11:26 1 -> pipe:[20619]
l-wx------ 1 us sudo 64 Sep 24 11:26 2 -> pipe:[20620]
lrwx------ 1 us sudo 64 Sep 24 11:26 3 -> socket:[30376]
lr-x------ 1 us sudo 64 Sep 24 11:26 4 -> /dev/null
l-wx------ 1 us sudo 64 Sep 24 11:26 5 -> pipe:[30639]
lrwx------ 1 us sudo 64 Sep 24 11:26 6 -> socket:[27522]

答案1

不是以干净或便携的方式。您必须附加一个调试器,例如gdb,打开一些目标文件并将其复制到 fd 1 中。与

gdb -p <PID> -batch -ex 'call dup2(open("<PATH>", 2), 1)'

pipe:[digits]是一个“匿名”管道,由cmd | cmdshell 构造创建。

然而在 Linux 上它并不是真正的匿名,因为你可以通过/proc/<PID>/fd/<NUM>.所以你还有另一个选择(这肯定会造成比使用gdb) 造成的破坏:打开管道的另一侧,杀死从中读取的任何程序,并将cat其删除到其他地方。愚蠢的例子:

% while sleep 1; do TZ=Zulu date; done | wc -c &
[1] 26727
% ps
  PID TTY          TIME CMD
20330 pts/1    00:00:00 bash
26726 pts/1    00:00:00 bash     # this the while ... done process
26727 pts/1    00:00:00 wc
26745 pts/1    00:00:00 sleep
26746 pts/1    00:00:00 ps
% ls -l /proc/26726/fd/1
... /proc/26726/fd/1 -> 'pipe:[1294932]'
% exec 7</proc/26726/fd/1        # open the other side of the pipe
% kill 26727                     # kill wc -c
% cat <&7
Fri 24 Sep 2021 01:25:52 PM UTC
Fri 24 Sep 2021 01:25:53 PM UTC
Fri 24 Sep 2021 01:25:54 PM UTC
...

相关内容