非常に単純な形式では、次のように呼び出しスクリプトを強制終了できます。
#!/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 が別のプロセスで再利用されるという潜在的な問題が発生します。それを解決することは、読者の課題として残されています。:-)