出力をリダイレクトする方法と方法を知っています。それらを鎮めるバッシュから。これで、誤って出力リダイレクト部分をコマンド(2>&1
または> /tmp/mystdout
)に追加するのを忘れてしまいましたstdout
。stderr
私は本当にアプリケーションを終了して再起動したくありません。
要求どおりに具体的に作成してください。ザイルズ彼の意見では、私は特に次のようなシナリオでこれを扱いたいと思います。
- 無効な出力ファイル
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
場合はそのプロセス)に接続します。セッションでこれを行うことの利点は、状態になったら簡単に切断して再接続できることです(たとえば、ローカルセッションを閉じて家に帰り、再び開くなど)。reptyr
screen
screen
screen