Process

如何將正在執行的程序輸出從管道重定向到其他東西?

  • September 24, 2021

有沒有辦法從那個“管道”重定向標準輸出(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]

不是以乾淨或便攜的方式。您必須使用調試器附加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
...

引用自:https://unix.stackexchange.com/questions/670449