以非常简单的形式,您可以像这样终止调用脚本:
#!/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
第一个脚本段中存在相同的潜在问题;您需要提供保险,确保 $$ 在您杀死它之前仍然是您的想法。此外,信号将被发送到 shell 包装器,而不是直接发送到您的命令。您必须测试信号是否按预期传递到您的命令。
Note also that this backgrounds the timeout/kill. The "wait" tells the script to wait until the first background process is finished, so either your command finishes by itself or it gets killed by the timeout ... and then the script proceeds to anything after the wait
. If the command finishes by itself, then that's where you run into potential issues with $pid being recycled for another process. Solving that is left as an exercise for the reader. :-)