プロセスの実行中にパイプを編集する方法はありますか?

プロセスの実行中にパイプを編集する方法はありますか?

私は時々次のプロセスを使用します。

  • スロースタート
  • しばらく走る
  • 大量の情報を標準出力に書き込む

たとえば、これが大規模なWebアプリケーションであるとします。

さて、当分の間は包含内容を見たいと仮定しますfoo。結局、次のようなことができます。

$ heavy_process
# watch for a bit
# ah, now I just want to see lines that contain 'foo'
# (kill heavy_process)

$ heavy_process | grep foo
# watch for a bit
# ok, I'm statisfied about foo. Let's look at bar instead
# (kill heavy_process)

$ heavy_process | grep bar

heavy_process本当に変えたいとき| grep

コマンドラインからパイプライン内で「パイプを追加および削除する」方法はありますか?

答え1

私の考えでは制御プロセス避けにくい。私はいろいろな方法を考えることができる。grep代わりに、コアに沿って動的パターンマッチングが動的にロードされawk '$0 ~ pat'ますpat(たとえば、GNU awkcoprocessを介して)。または基本パターン注入ソリューションモード変更awk次のように、フィルタがパターンを動的に簡単に調整できるように、ディレクティブがデータストリームに挿入されます。

mkfifo cmdfifo       # create once an asynchroneous communication channel

{ while read cmd < cmdfifo ; do printf "%s\n" "@$cmd" ; done &
  heavy_process ;} |
    awk '
        /^@/ { pat = substr($0,2) ; next }   # parse the injected pattern
        pat !="" && $0 ~ pat     # if pattern is set print matching lines
    '

検索 特定のモードを有効または切り替えるには、次を使用できます。

echo bar > cmdfifo

「bar」マッチングを有効にした後

echo foo > cmdfifo

モードを「foo」に動的に変更します。

答え2

私はあなたの提案がバックグラウンドでコマンドを実行したときに修正された最良の解決策だと思います。

heavy_process > some_file &

stderrで検索できるようにするテキストを作成するには、2>&1ifを追加します。heavy_processプログラムが「多くの情報を標準出力に書き込む」と言ったので、プロセスが非同期的に実行されるようにコマンドの2>&1最後に。&ランニング。使用するシェルによっては、終了時に通知を受け取ることもあります。

検索プロセスの出力これまで、あなたに必要なこと

grep foo some_file

これまでの検索結果 プロセスがファイルに書き込んでいる間、ファイルを監視し続けます。、使用

tail -n +1 -f some_file | grep foo

それ以外の場合は、-n +1ファイルtailの最後の10行だけが提供されます。

答え3

次のスクリプトを作成できます。

#! /bin/bash
while true;
do
        echo -n "Enter your regexp: "
        read myregexp
        heavy_process | grep "$myregexp"
done

Ctrl-cを使用していつでもプロセスを中止できます。

関連情報