1

私のプログラムは 2 つの変数 (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 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 に答える