1

我的程序需要两个变量(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 
4

1 回答 1

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 的返回值。

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

也看看这个答案。它显示了启动进程然后超时的其他方法,而不依赖于超时程序:

(取自答案):

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

但是,在您的情况下,您正在运行很多程序。所以这会导致很多运行的后台进程休眠 DURATION,所以这可能并不理想。另一个答案也有同样的问题。

于 2013-10-19T11:51:01.173 回答