0

タイムアウト後に強制終了する必要があるコマンド ($run_command など) があります。解決策は非常に単純です。coreutilsのtimeoutまたは他の stackoverflow トピックのtimeout3 を使用するだけです。しかし、私のコマンドは、このように untar pipe smth から stdin を受け取ります

tar -xO -f "$1" | /usr/bin/time -f "%e" --output=$time_output -- $run_command

$run-commandは私のコマンドで、実行時間も測定されています ( timeユーティリティを使用)。

質問は、タイムアウトユーティリティに untar 時間を含めることを回避する最善の方法は何かということです。

4

2 に答える 2

3

非常に単純な形式では、次のように呼び出しスクリプトを強制終了できます。

#!/bin/bash

( sleep $timeout_period && kill $$ ) &

tar -xO -f "$1" | ...

もちろん、これは単なる例です。実行時に $$ が同じスクリプトであることを保証する必要がありますkill

もちろん、これはtime(スクリプトが強制終了された場合は $timeout_period になります) を含め、スクリプト全体を強制終了します。

更新#1

一時ファイルを使用した例。

tmpfile=$(/usr/bin/mktemp /tmp/temp.XXXXX)

tar -xO -f "$1" > $tmpfile
trap "rm -f $tmpfile" 0 1 2 3 15

/usr/bin/time -f "%e" --output=$time_output -- $run_command < $tmpfile

ファイルシステムの速度/パフォーマンスが原因で、これでもエラーが発生する可能性があることに注意してください。

更新#2

tarこれにより、時間の免除に加えて、タイムアウト機能が追加されます。

(
  tmpfile=$(/usr/bin/mktemp /tmp/temp.XXXXX)
  tar -xO -f "$1" > $tmpfile
  trap "rm -f $tmpfile" 0 1 2 3 15
  /usr/bin/time -f "%e" --output=$time_output -- $run_command < $tmpfile
) &

pid=$!

( sleep $timeout_period && kill $pid ) &

wait %1

最初のスクリプト セグメントに同じ潜在的な問題が存在します。$$ を殺す前に、$$ が自分の考えのままであるという保険を提供する必要があります。また、シグナルはコマンドに直接送信されるのではなく、シェル ラッパーに送信されます。シグナルが期待どおりにコマンドに渡されるかどうかをテストする必要があります。

これにより、タイムアウト/キルがバックグラウンド化されることにも注意してください。「待機」は、最初のバックグラウンドプロセスが終了するまで待機するようにスクリプトに指示するため、コマンドが自動的に終了するタイムアウトによって強制終了されます...その後、スクリプトはwait. コマンドが単独で終了した場合、ここで $pid が別のプロセスで再利用されるという潜在的な問題が発生します。それを解決することは、読者の課題として残されています。:-)

于 2012-06-11T03:20:42.800 に答える
1

この例で探しているのは、パイプラインではなく一時ファイルだと思います。ほとんどの場合、パイプラインを並行して実行する必要があります。あなたの場合(プロファイリング)、および後のコマンドを実行する前に先行するコマンドが成功する必要がある場合は、順次操作が望ましいです。mktempこの効果のために使用することをお勧めします。の出力に常に依存しているため、プロセス置換またはmkfifoこの例のいずれかで FIFO を使用する方法がわかりません。$run_commandtar

于 2012-06-11T02:02:51.047 に答える