進行状況をSTDOUT
に出力する長時間実行プロセス(シミュレーション)を多数実行します。 STDOUT
にリダイレクトするのを忘れて、grep
できるファイルにリダイレクトすることがあります。通常、再起動するには遠すぎます。
QUESTION:プロセスを停止せずに、別のSTDOUT
にフックする方法はありますか?
これらは常にOSX10.7.3のZSHでGNU画面で実行されています。
賢い hack 言及 here GDBを使用してプロセスに接続し、 dupx
という名前のユーティリティがこれをまとめます機能。
dupx
manpage から:
Dupxは、すでに実行中のプログラムのファイルを再マップするためのシンプルなユーティリティです。 Bashのようなシェルは、プログラムの開始時に_
>, < -
_のような構文を使用して、簡単な入力/出力/エラーのリダイレクトを可能にします。たとえば、_echo 'redirect this text' > /tmp/stdout
_はecho
の出力を_/tmp/stdout
_にリダイレクトします。 。ただし、標準シェルは、すでに開始されているプロセスの出力(または入力、またはエラー)の再マッピング(リダイレクト)機能を提供しません。 Dupxは、
dup(2)
内からgdb(1)
システムコールを使用してこの問題に対処しようとします。 Dupxは現在、gdb
スクリプトの単純なシェルラッパーとして実装されています。
画面のlog
コマンドを使用します(!)
プロセスはすでにスクリーンセッションで実行されているので、そのウィンドウの出力をログに記録するようにスクリーンに指示するだけです。
スクリプトのウィンドウに切り替えて、 C-aH 記録する。
今、あなたはできる:
$ tail -f screenlog.2 | grep whatever
画面のマニュアルページから:
ログ[オン|オフ]
現在のウィンドウの出力をウィンドウのデフォルトディレクトリにあるファイル「screenlog.n」への書き込みを開始/停止します。nは現在のウィンドウの番号です。このファイル名は、「logfile」コマンドで変更できます。パラメータが指定されていない場合、ロギングの状態が切り替わります。セッションログは、ファイルがすでに存在する場合、ファイルの以前の内容に追加されます。現在の内容とスクロールバック履歴の内容は、セッションログに含まれません。デフォルトは「オフ」です。