
しばらく stdout にデータを生成し、その後実行を継続しますが、それ以上のデータは出力しないソフトウェアがあります。
その出力を取得してさらに処理し、出力をファイルに保存するパイプラインがあります。ただし、元のプロセスは出力の生成を終了した後も実行し続けるため、これを手動で終了する必要があります。実行中のプログラムが数秒間出力を生成しなくなったら、そのプログラムを強制終了するコマンドはありますか?
タイムアウト コマンドについては知っていますが、これは固定のタイムアウトで動作するようです。ソフトウェアがどのくらいの時間出力を続けるかを確実に判断する方法がありません。
例:
次のような見た目で変更できないものがあるとしますgenerate-data
。実際には、これは変更したくないコンパイル済みソフトウェアです。
#! /usr/bin/env bash
for x in {1..5}; do
echo $x
sleep 1
done
while true; do sleep 1; done
現在、 のようなものを実行しています./generate_data | grep '[2-4]' > output
が、必要な出力は生成されますが、終了しません。
generate_data
2 秒間何も出力されなくなったらパイプラインを終了したいと思います。
答え1
readコマンドを使用します。-tスイッチが便利です。
(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
出力:
we
re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
出力:
we
re
e d
dd