クラスターに送信してsgeする必要のあるジョブが200以上あります。それらを2つのキューに送信します。キューの1つに、ジョブを送信したくないマシンがあります。そのマシンを除外するにはどうすればよいですか?私が役立つと思ったのは、(q1で使用可能な3つの有効なノードと、q2で使用可能なすべてのノードが有効であると仮定した場合)だけです。
qsub -q q1.q@n1 q1.q@n2 q1.q@n3 q2.q
クラスターに送信してsgeする必要のあるジョブが200以上あります。それらを2つのキューに送信します。キューの1つに、ジョブを送信したくないマシンがあります。そのマシンを除外するにはどうすればよいですか?私が役立つと思ったのは、(q1で使用可能な3つの有効なノードと、q2で使用可能なすべてのノードが有効であると仮定した場合)だけです。
qsub -q q1.q@n1 q1.q@n2 q1.q@n3 q2.q
実行したくない場合はn4と呼ばれ、スクリプトに次を追加すると機能するはずです。
#$ -l h=!n4
送信されたスクリプトに-lオプションを埋め込むのではなく、qsubコマンドラインに追加すると、ほとんどのシェルで感嘆符を引用符で囲む必要があります。
これについて私が見つけた最善の方法は、実行を許可するノードにカスタムリソースを設定し、ジョブを送信するときにそのリソースを要求することです。
qmonで、「複雑な」構成に移動し、新しい属性を追加します。名前を「my_allowed」のようなものに設定し、ショートカットを「m_a」のようなものに設定し、タイプをBOOLに、リレーションを==に、要求可能をYesに、消耗品をNoに設定し、「追加」します。複雑な構成に変更をコミットします。
次のステップはおそらくコマンドラインから実行する方が簡単ですが、qmonでも実行できます。ジョブの実行を許可する各ホストに消耗品を追加する必要があります。qmonでは、ホスト構成に移動し、実行ホストを選択して、各ホストを順番に開き、[消耗品/固定属性]タブをクリックして、値として「True」を使用して上記で構成した新しい複合体を追加できます。コマンドラインから、「qconf-sel」を使用して実行ホストのリストを取得できます。このリストは、ループに渡して、含めたくないホストを取得するのに適しています。このようなことをします:
qconf -sel | grep -v host_to_exclude | while read host; do
EDITOR="ed" qconf -me $h <<EOL
/complex_values/s/$/,my_test=True/
w
q
EOL
done
これにより、プログラムでホストを編集できます(qconfはエディターを起動するため、通常は許可されません)。これは、エディターを「ed」に設定することで実行されます(edエディターがインストールされていることを確認する必要があります...最初に手動で実行してみてください...「q」と入力して終了してください)。edはstdinの編集コマンドのリストを取得するため、3つのコマンドを指定します。1つ目は、complex_valuesが含まれる行を編集して、my_test値を含めます。2番目は一時ファイルを書き出し、3番目は終了します。
これを行ったら、新しいコンプレックスを必要とする制限オプションを使用してジョブを送信します。
qsub -q whatever -l my_test=True my_prog.sh
-lオプションは制限を設定し、my_test = Trueは、ジョブがTrueの値を持つ複雑なmy_testを持つホストでのみ実行できることを示します。コンプレックスは消耗品ではないため、各ホストで必要な数のジョブを実行できますが(ホストのスロット制限まで)、my_testコンプレックスがTrueに設定されていないホストは回避されます。 。
これには良いバイパスがあります。
簡単なbashファイルを生成します。
#!/bin/bash
sleep 6000 #replace 6000 with any long period of time that will be enough to submit your jobs
このジョブを、完全に占有するまで除外するノードに送信します。
出来上がり、あなたのノードは除外されています。