実行中のプロセスの出力リダイレクトを変更するには?

実行中のプロセスの出力リダイレクトを変更するには?

出力をリダイレクトする方法と方法を知っています。それらを鎮めるバッシュから。これで、誤って出力リダイレクト部分をコマンド(2>&1または> /tmp/mystdout)に追加するのを忘れてしまいましたstdoutstderr私は本当にアプリケーションを終了して再起動したくありません。

要求どおりに具体的に作成してください。ザイルズ彼の意見では、私は特に次のようなシナリオでこれを扱いたいと思います。

  • 無効な出力ファイル
  • stderr次にリダイレクトするのを忘れました。stdout

または両方の組み合わせ

たとえば、私はApacheを実行しており、次のことができます。バラよりファイル記述子:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

答え1

リダイレクトを使用できます(https://github.com/jerome-pouiller/reredirect/)。

reredirect -m /dev/null <PID>

後で、次のコマンドを使用してプロセスの初期出力を復元できます。

reredirect -N -O <M> -E <N> <PID>

(以前に開始されたリダイレクトによって提供されます)<M><N>

reredirect は、README他のコマンドや stdout または stderr にリダイレクトする方法も説明します。

答え2

それは不可能です。または、少なくとも簡単ではありません。 gdbをプロセスに接続してgdbで操作するのは幸運ですが、これは成功と同じくらい簡単にクラッシュする可能性があります。

答え3

使用する必要がありますレプテル新しい現在の端末に別のプロセスを接続します。たとえば、GNUscreenユーティリティをインストールして使用し、reptyrその中のコマンドを実行して他のプロセスのリダイレクト(およびターミナルコントロール)を「インポート」し、それを新しい現在のターミナル(で起動したscreen場合はそのプロセス)に接続します。セッションでこれを行うことの利点は、状態になったら簡単に切断して再接続できることです(たとえば、ローカルセッションを閉じて家に帰り、再び開くなど)。reptyrscreenscreenscreen

関連情報