n 秒間データが流れない場合はパイプラインを終了する

n 秒間データが流れない場合はパイプラインを終了する

しばらく 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_data2 秒間何も出力されなくなったらパイプラインを終了したいと思います。

答え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

関連情報