実行中のプロセスの標準出力を表示したくない場合はどうすればよいですか?

実行中のプロセスの標準出力を表示したくない場合はどうすればよいですか?

長期的に多くの標準出力を提供するとき、実行中のプロセスを終了して再実行したくないでしょう。出力が表示されないのはなぜですか?ありがとうございます。

答え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

関連情報