実行中のプロセスの出力リダイレクトを変更するにはどうすればよいですか?


11

私は出力をリダイレクトする方法とbashでそれら抑制する方法を知っています。今、私は誤って(例えば、コマンドへの出力のリダイレクト部分を追加するのを忘れたと仮定2>&1または> /tmp/mystdout)、私のバックグラウンド・プロセスがすでにしばらく実行されて、私はまだどこに変更することができますstdoutし、stderrに書き込まれていますか?アプリケーションを強制終了して再起動したくないのですが。

Gillesのコメントで尋ねられたように、より具体的に説明するために、以下のシナリオで具体的に説明します。

  • 間違った出力ファイル
  • リダイレクトstderrするのを忘れたstdout

または両方の組み合わせ

たとえば、Apacheを実行していて、ファイル記述子を確認できます。

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

別の端末に変更しますか?またはファイルに?現在のターミナルまたは新しい画面セッションへの接続に満足している場合は、実行中のプロセスを否認して新しい画面シェルに関連付けるに
Gilles「SO-悪をやめる」

回答:


8

reredirect(https://github.com/jerome-pouiller/reredirect/)を使用してそれを行うことができます。

reredirect -m /dev/null <PID>

次のようなものを使用して、プロセスの初期出力を後で復元できます。

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

<M>および<N>リダイレクトの以前の起動によって提供されます)。

reredirect READMEは、別のコマンドにリダイレクトする方法、またはstdoutまたはstderrのみをリダイレクトする方法についても説明しています。


3

それは可能ではありません。または、少なくとも簡単ではありません。プロセスにgdbをアタッチし、gdbでそれをいじくる運があるかもしれませんが、それは成功と同じくらい簡単にクラッシュを引き起こす可能性があります。



それらを共有してお気軽に、私は答えを
賛成し


1
結構です。他のバグにリンクされているすべてのツールは、別の端末/画面セッションに接続することに関するものです。別のファイルへのリダイレクトについてではありません。代わりにreptyrにパッチを適用してファイルにリダイレクトすることはおそらく難しくありません。
Dennis Kaarsemaker

私はreptyrのソースを少し調べましたが、答えの「簡単ではない」部分にほとんど同意します。しばらくしてから、もう少し詳しく説明します。
gertvdijk 2013年

2

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


回答ありがとうございます。ターミナルの取り外し/取り付けについては質問していないので、私の場合は役に立ちません。私の質問と具体例をもう一度読んでください。
gertvdijk

ああ、その場合:reptyrコードを読んで、stdoutまたはstderrのみをリダイレクトするようにコードを変更する方法を見つけてください。次に、新しくアタッチされたストリームを目的の場所にリダイレクトする別のシェルから実行しますか?(または、より良い、reptyrソースを使用して、リダイレクトを直接行います)
Olivier Dulac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.