ループを中断し、正しい変数値を使用してループの先頭に戻ります。

ループを中断し、正しい変数値を使用してループの先頭に戻ります。

プロセスをサーバーに送信していますが、一度に特定の数のプロセスしか実行したいと思います。そのため、実行中のジョブ数を繰り返し確認し、現在のジョブ数が特定のレベルを超えない場合にのみ新しいジョブを送信します。これを行うには、より多くのジョブを送信するために現在のキューがいっぱいになるまで待つ必要があります。

私はこれを達成する方法を知りたいです。

#!/bin/bash

for i in `seq 10`; do
    if [ condition1 -le condition2 ]; do
        #>>> Submit jobs
    else
        # SERVER IS FULL
        #
        # Wait 10min and try again, by returning to start of the loop
        # with the current value of $i intact
        sleep 10m 
done

私の直観が正しい場合、上記のループは、次に$(($i + 1))サーバーがいっぱいになると、$i一部のタスクが未処理のままになります。

この問題を解決する方法に関する提案はありますか?つまり、どのようにして2番目の句()から外れ、elseループの先頭に戻ることができますか?

答え1

簡単な解決策は、ロジックを少し変更することです。

i=1;
while [ "$i" -le 10 ]; do
    if [ condition1 -le condition2 ]; do
        #>>> Submit jobs

        ## Increment the value of $i if a job was submitted
        i=$((i+1))
    else
        # SERVER IS FULL
        #
        # Wait 10min and try again, by returning to start of the loop
        # with the current value of $i intact
        sleep 10m 
done

これにより、$iジョブが送信されたときにのみ増加します。サーバーがいっぱいになると、スクリプトは10分間待ってから同じ値で繰り返します$i

関連情報