2013-10-19 27 views
1

我的程序需要兩個變量(從0到100),其中n爲&。Bash:如果命令在給定的時間內沒有完成 - 更改變量

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

只是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休眠,所以這可能並不理想。另一個答案也有同樣的問題。

+0

TIL linux有一個'timeout'命令。謝謝!只是表明,即使過了幾十年,你從未完成學習Linux。 ;-) –

相關問題