私は時々次のプロセスを使用します。
- スロースタート
- しばらく走る
- 大量の情報を標準出力に書き込む
たとえば、これが大規模な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 awk
coprocessを介して)。または基本パターン注入ソリューションモード変更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>&1
ifを追加します。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を使用していつでもプロセスを中止できます。