Bashスクリプト - Nプロセスが常にslurmで起動されることを確認する

Bashスクリプト - Nプロセスが常にslurmで起動されることを確認する

仕事

このコマンドを使用して、リモート・システムで開始されたM個のジョブ/コマンドのリストから、srunすべてのM個のジョブが開始されるまで、常にN個のジョブが実行されているか要求されていることを確認します(N <= M)。

やる気

(他の提案につながる可能性があるため含まれています)私は現在、2段階のプロセスで実行されている一連のシミュレーションを実行する必要があります。両方のステップは、MSTR_FILEシミュレーションに関する基本情報を含めることに基づいています。

  1. ステップ1:次の内容に基づいてMSTR_FILEシミュレーションに必要なディレクトリとファイルを作成します。
  2. ステップ2:これで、コンテンツに基づいてMSTR_FILEファイル内の各項目の操作を開始します。

2番目のステップの基本ループは次のとおりです。

for d in $(cat $MSTR_FILE | cut -d " " -f 1);do
   cd $d
   srun -p My_Queue $(cat sim_command_file)&
   cd ..
done

これはうまくいきますが、私のシミュレーション設定(MSTR_FILE)は50〜100個、多分それよりも多くの項目で終わります。これらのループはリスト全体を繰り返し、リスト自体が終了するまでリソースを取得します。共有リソース環境では、これは実際には理想的ではありません。 :)

私の仕事ソリューションの一部

waitデフォルトでは、一定数の操作が完了するまでスクリプトを変更しました。スクリプトの関連部分は次のとおりです。

N=10
swp_list=($(cat $MSTR_FILE | cut -d " " -f 1))
cnt=0
list_size=$(#{swp_list[@]})

while [ $cnt -lt $list_size ];do
   for i in $(seq 0 $N);do
       ix=$(($cnt+$i))
       if [ $ix -lt $list_size ];then
          d=${swp_list[ix]}
          cd $d
          srun -p My_Queue $(cat sim_command_file)&
          cd ..
       fi
    done
    wait
    ((cnt+=$N))
done

私がテストしたところ、Nタスクは一度に実行されるため、このアプローチはうまく機能しているようです。しかし、ここには深刻な欠点もあります。要求されたすべてのジョブがN同時に開始されないことがあります。これらのタスクの一部は、ノードが割り当てられるまで長い時間を待ちます。そうでない場合でも、一部のシミュレーションタスクは他のシミュレーションタスクよりも時間がかかる場合があり、さらに時間がかかる場合があります。

部分的に動作する私の解決策は何も解決しません。ただNパケットのすべての操作が完了するのを待ちます。しかし、時間が無駄にならないように、queue常に次の作業でいっぱいになっているものがあればいいです。MSTR_FILE

関連情報