コマンドを実行し、実行時間が長すぎる場合は、bash スクリプトで強制終了する必要があります。また、すべての出力を変数にキャプチャする必要があります。コマンドが最初に終了した場合は、ウォッチドッグ プロセス (スリープなど) を解放/強制終了する必要があります。そのようなコマンドのリストを実行する可能性があるからです。
残念ながら、「タイムアウト」コマンドは利用できません。そうでなければ、次のようなことができます。
output=`timeout -s 9 $TIMEOUT my-command`
終了コード 124 をチェックして、タイムアウトが発生したかどうかを確認します。
したがって、私の選択した解決策は、同様の質問に対する @Dmitry によるものです。
( my_command ) & pid=$!
( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher
残念ながら、以下は $output に何もキャプチャしません:
( output=`my_command` ) & pid=$!
出力をファイルにダンプしてから、次のように変数にロードすることもできますが、ファイルなしで行うことをお勧めします。
( `my_command >$outfile` ) & pid=$!
...
output=`cat $outfile`
rm -f $outfile
私の質問: より良い方法はありますか? ファイルを使用せずに stderr も別の変数にキャプチャするのが理想的ですか?