Bash:如果命令没有在给定时间内完成 - 更改变量

时间:2013-10-19 11:09:14

标签: bash

我的程序有两个变量(n& k,从1到100)。

PROGRAM n k INPUT > OUTPUT 

我想知道哪个变量组合能提供最佳输出。这是我这样做的方式:

for n in {1..100}; do
   for k in {1..100}; do
       PROGRAM n k INPUT |
       awk -v n="$n" -v k="$k" '{print n,k,$0}' >> OUTPUT # Latter I analyse output and select best combination
   done
done

这完美无缺。然而,一些变量(例如,从80到90的n)需要很长时间才能运行 我想要的是什么:
    运行给定脚本一段特定时间,如果PROGRAM尚未完成跳转到以下变量 例如:

(n=11; k=23) PROGRAM 11 23 INPUT # Runs 59 seconds -- OK
(n=11; k=24) PROGRAM 11 24 INPUT # Runs 34 seconds -- OK
(n=11; k=25) PROGRAM 11 25 INPUT # Already runs 60 seconds -- Too much. End and jump to (n=11; k=26)
(n=11; k=26) PROGRAM 11 26 INPUT 

1 个答案:

答案 0 :(得分:4)

只需使用timeout运行脚本即可。安装它,例如在Ubuntu上sudo apt-get install coreutils。然后使用timeout DURATION PROGRAM n k INPUT

运行您的脚本
for n in {1..100}; do
   for k in {1..100}; do
       timeout 60 PROGRAM n k INPUT |
       awk -v n="$n" -v k="$k" '{print n,k,$0}' >> OUTPUT # Latter I analyse output and select best combination
   done
done

如果你想做某事,你可以检查超时的返回值。

timeout DURATION PROGRAM n k INPUT
if [ $? -ne 0 ]; then
    # it was killed (timeout returns non-zero if it killed the program)
    echo "took too long"
fi

另请查看this answer。它显示了启动进程然后超时的其他方法,而不依赖于超时程序:

(摘自答案):

( cmdpid=$BASHPID; (sleep DURATION; kill $cmdpid) & exec PROGRAM n k INPUT )

但是,在你的情况下,你运行了很多程序。因此,这将导致大量正在运行的后台进程在DURATION中休眠,因此这可能并不理想。另一个答案也有同样的问题。