2 つのコマンドを実行するスクリプトがあります。最初のコマンドは、データを一時ファイルに書き込みます。最初のコマンドがバックグラウンドで実行されている間に、2 番目のコマンドは awk にパイプします。2 番目のコマンドの awk は、一時ファイルからデータを読み取る必要がありますが、データが一時ファイルに書き込まれるよりも高速に独自のデータを解析しています。
次に例を示します。
#!/bin/bash
command1 > /tmp/data.txt &
# command1 takes several minutes to run, so start command 2 while it runs in the background
command2 | awk '
/SEARCH/ {
#Matched input so pull next line from temp file
getline temp_line < "/tmp/data.txt"
}
'
これは、awk が command2 からのデータを非常に高速に解析して command1 が追いつかない場合を除き、機能します。つまり、command1 が書き込みを完了する前に、awk が /tmp/data.txt から EOF を取得しています。
また、次のように、getline の周りにいくつかのチェックをラップしようとしました。
while ((getline temp_line < "/tmp/data.txt") < 0) {
system("sleep 1") # let command1 write more to the temp file
}
# Keep processing now that we have read the next line
しかし、一時ファイルでEOFに達すると、それからの読み取りが停止すると思います。またはそのようなもの。
command1 が awk が一時ファイルから読み取ろうとするよりも速く一時ファイルに書き込む限り、スクリプト全体が機能します。2 つのコマンドの間に sleep 10 コマンドを挿入すると、一時ファイルによって十分なバッファーが作成され、スクリプトによって必要な出力が生成されます。しかし、私がテストしたものよりもはるかに大きなファイルを解析している可能性があるか、コマンドが異なるシステムで異なる速度で実行される可能性があるため、データが書き込まれるまでファイルを待機する安全メカニズムが必要です.
どうすればこれを行うことができますか?