2

コマンドを実行し、実行時間が長すぎる場合は、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 も別の変数にキャプチャするのが理想的ですか?

4

1 に答える 1

1

幸いなことに、$()表記法では複数のコマンドが許可されているため、次のようにすることができます。

output=$(
    ( my_command ) & pid=$!
    ( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
    wait $pid 2>/dev/null && pkill -HUP -P $watcher
)

また、regular()を使用してコマンドをグループ化し、すべての出力をリダイレクトすることもできます。を使用して stderr を stdout にリダイレクトできる2>&1ため、最終的には次のようになります。

output=$(
    (
        ( my_command ) & pid=$!
        ( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
        wait $pid 2>/dev/null && pkill -HUP -P $watcher
    ) 2>&1
)
于 2013-06-29T17:11:11.823 に答える