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
...