長期的に多くの標準出力を提供するとき、実行中のプロセスを終了して再実行したくないでしょう。出力が表示されないのはなぜですか?ありがとうございます。
答え1
1 つの方法は、プロセスにデバッガを接続し、/dev/null で標準出力を開くようにすることです。
gdb --batch -ex 'call close(1)' -ex 'call open("/dev/null",2)' -p "$pid"
答え2
ここで@jimmijが指摘した解決策をもたらし、少し修正します。
(gdb) attach <pid>
...
(gdb) call open("/dev/null",O_WRONLY)
$1 = 3
(gdb) call dup2($1,fileno(stdout))
$2 = 1
(gdb) call close($1)
...
(gdb) detach
...
gdbに慣れていない人のために説明すると、「attach」、「call」、「detach」はgdbコマンドです。情報を取得するには、gdb プロンプトで「help Attach」を使用します。 「open」、「dup2」、「close」はライブラリ関数です。 「man 2 open」で情報を入手してください。
ここで、O_WRONLYは1に等しく、fileno(stdout)は1に等しくなります。リテラル値を使用します。そうしないと、gdbでシンボルの欠落について文句を言うことができます。
すでに開いているファイル記述子を探したい場合は、これを行うことができます。
$ cd /proc/<pid>/fd
$ for i in * ; do
if [[ `readlink $i` == "/dev/null" ]]
fd=$i ; break
fi
done
答え3
以下は、通常の戻りとエラーメッセージを防ぎます。
2&>1 >/dev/null