我的程序有两个变量(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
答案 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中休眠,因此这可能并不理想。另一个答案也有同样的问题。