web-dev-qa-db-ja.com

既存のシェルのSTDOUTをリダイレクト/ grepする

進行状況をSTDOUTに出力する長時間実行プロセス(シミュレーション)を多数実行します。 STDOUTにリダイレクトするのを忘れて、grepできるファイルにリダイレクトすることがあります。通常、再起動するには遠すぎます。

QUESTION:プロセスを停止せずに、別のSTDOUTにフックする方法はありますか?

これらは常にOSX10.7.3のZSHでGNU画面で実行されています。

3
jmdeldin

賢い hack 言及 here GDBを使用してプロセスに接続し、 dupx という名前のユーティリティがこれをまとめます機能。

dupxmanpage から:

Dupxは、すでに実行中のプログラムのファイルを再マップするためのシンプルなユーティリティです。 Bashのようなシェルは、プログラムの開始時に_>, < -_のような構文を使用して、簡単な入力/出力/エラーのリダイレクトを可能にします。たとえば、_echo 'redirect this text' > /tmp/stdout_はechoの出力を_/tmp/stdout_にリダイレクトします。 。

ただし、標準シェルは、すでに開始されているプロセスの出力(または入力、またはエラー)の再マッピング(リダイレクト)機能を提供しません。 Dupxは、dup(2)内からgdb(1)システムコールを使用してこの問題に対処しようとします。 Dupxは現在、gdbスクリプトの単純なシェルラッパーとして実装されています。

5
Matt Eckert

画面のlogコマンドを使用します(!)

プロセスはすでにスクリーンセッションで実行されているので、そのウィンドウの出力をログに記録するようにスクリーンに指示するだけです。

スクリプトのウィンドウに切り替えて、 C-aH 記録する。
今、あなたはできる:

$ tail -f screenlog.2 | grep whatever

画面のマニュアルページから:

ログ[オン|オフ]

現在のウィンドウの出力をウィンドウのデフォルトディレクトリにあるファイル「screenlog.n」への書き込みを開始/停止します。nは現在のウィンドウの番号です。このファイル名は、「logfile」コマンドで変更できます。パラメータが指定されていない場合、ロギングの状態が切り替わります。セッションログは、ファイルがすでに存在する場合、ファイルの以前の内容に追加されます。現在の内容とスクロールバック履歴の内容は、セッションログに含まれません。デフォルトは「オフ」です。

0
lemonsqueeze