Process
如何將正在執行的程序輸出從管道重定向到其他東西?
有沒有辦法從那個“管道”重定向標準輸出(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 | cmd
shell 構造創建。但是在 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 ...