実行中のプロセス出力をパイプから別のものにリダイレクトするにはどうすればよいですか?

実行中のプロセス出力をパイプから別のものにリダイレクトするにはどうすればよいですか?

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一部のオブジェクトファイルを開いてfd1にコピーするなど、デバッガをリンクする必要があります。そして

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

これはシェル構造によって生成されたpipe:[digits]「匿名」パイプです。cmd | cmd

しかし、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
...

関連情報