ジョブをグループ分けしてジョブ群毎にジョブを管理したい

複数のジョブに同一の名前を付けることで、グループ毎の管理を行うことができます。 名前はジョブの qsub 時、もしくは、実行待ちのジョブに対して付けることができます。既に実行されているジョブに名前を付けることはできません。

$ qsub -N GROUP1 [ジョブスクリプト名 1]
$ qsub -N GROUP1 [ジョブスクリプト名 2]
$ qsub -N GROUP2 [ジョブスクリプト名 3]
$ qsub -N GROUP2 [ジョブスクリプト名 4]

グループ単位でジョブを削除する

GROUP1 を削除する。

$ qdel GROUP1

グループ単位でジョブのオプションを変更する

GROUP2 の UGE オプションと、ジョブスクリプト引数を変更する。

$ qalter <UGE オプション> GROUP2 [ジョブスクリプト引数]

ジョブの実行順を制御したい

下記のようなオプション指定で実現できます。

$ qsub -N job1 [ジョブスクリプト名]
$ qsub -N job2 -hold_jid job1 [ジョブスクリプト名]
$ qsub -N job3 -hold_jid job1,job2 [ジョブスクリプト名]

各ジョブには別名 「job1」「job2」「job3」が設定されます。「job1」が実行完了した後に「job2」が実行され、「job1」と「job2」が実行完了した後に「job3」実行されます。

下記のように正規表現を利用しても上述と同様の実行順が設定可能です。

$ qsub -N job1 [ジョブスクリプト名]
$ qsub -N job2 -hold_jid job1 [ジョブスクリプト名]
$ qsub -N job3 -hold_jid "job*" [ジョブスクリプト名]

参考: 実行順序があるジョブの実行

実行順を設定したジョブにおいて、先に実行されたジョブ内で、後に実行されるジョブを制御したい

「ジョブ A の実行完了後に実行されるジョブ B が存在する。ジョブ A でエラーが発生した際にはジョブ B の実行を中止する」ことは、下記の設定により実現可能です。     

ジョブ A のエラー処理内に、下記のコマンドを実行するよう記述する。

$ qdel jobB

ジョブの実行順を設定してジョブを qsub する。

$ qsub -N jobA [ジョブスクリプト名]
$ qsub -N jobB -hold_jid jobA [ジョブスクリプト名]

複数の種類のキューを指定してジョブを qsub する方法

SHIROKANE では、実行までの待ち時間が短くするために、qsub 時に何もオプションを指定せずとも mjobs.q、ljobs.q、lmem.q のいずれかのキューを実行する計算のノードの候補にします。

キューを候補とした際のキューの選択順位は以下の通りです。

lmem.q > ljobs.q > 専有キュー > mjobs.q

例 1 mjobs.q、ljobs.q、lmem.q、mjobs_rerun.q のいずれかでジョブを実行する

$ qsub [ジョブスクリプト名]

オプションを何も指定しなければ mjobs.q、ljobs.q、lmem.q、mjobs_rerun.q のいずれかでジョブが実行されます。

例 2 mjobs.q、ljobs.q のいずれかでジョブを実行する

$ qsub -soft -l ljob [ジョブスクリプト名]

または

$ qsub -q mjobs,q.ljobs.q [ジョブスクリプト名]

上記のオプションを使用することで mjobs.q、ljobs.q のいずれかでジョブが実行されます。lmem.q ではジョブは実行されません。

例 3 mjobs.q、ljobs.q、lmem.q のいずれかでジョブを実行する

$ qsub -q '!mjobs_rerun.q' [ジョブスクリプト名]

例 1 から mjobs_rerun.q を除く方法です。ジョブが自動再実行されにくくなりますが、待ち時間は増えます。

例 4 mjobs.q を優先し、 mjobs.q、ljobs.q、lmem.q のいずれかでジョブを実行する場合

-q オプションと -soft オプションを組み合わせることで mjobs.q を優先的に選択させることができます。

$ qsub -soft -q mjobs.q -l ljob,lmem [ジョブスクリプト名]

この場合の場合のキューの選択順位は mjobs.q > ljobs.q > lljobs.q > lmem.q > 専有キュー です。 この場合、 mjobs.q に空きがあれば、 mjobs.q 以外のキューでジョブが実行されることはありません。

メモリ利用量を宣言する場合には、 -l s_vmem=XG,mem_req=XG を指定する場所に気をつける必要があります。

例 5 (誤った例) -soft を使用しつつ、メモリ宣言量を指定する

$ qsub -soft -l s_vmem=8G,mem_req=8G,ljob,lmem [ジョブスクリプト名]

例 6 (正しい例) -soft を使用しつつ、メモリ宣言量を指定する

$ qsub -l s_vmem=8G,mem_req=8G -soft -l ljob,lmem [ジョブスクリプト名]

または

$ qsub -soft -l ljob,lmem -hard -l s_vmem=8G,mem_req=8G [ジョブスクリプト名]

-l s_vmem=XG,mem_req=XG-hard オプションの後ろに指定する必要があり、-soft オプションの後ろに指定することはできません。 ただし qsub のオプションはデフォルトでは -hard オプションとして扱われるため、-soft オプションを使用しない場合は意識する必要はありません。 -soft を使用する場合は -soft の前、もしくは明示的に -hard を指定した上で、-l s_vmem=XG,mem_req=XG を記述してください。

環境変数を設定して、ジョブを qsub したい

ジョブの環境変数の設定は、ジョブスクリプトの内部の開始部分で行うことが基本です。 ジョブを qsub する前に設定した環境変数をジョブスクリプトの中で使用できるようにするには次のようにします。

例えば、 Perl スクリプトを実行する際に、環境変数を設定するためには、qsub コマンド-v オプションを使用します。

$ qsub -v LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH,PATH=$HOME/bin:$PATH \
-S /usr/local/bin/perl [Perl のジョブスクリプト名]

下記のように、Perl スクリプト内に UGE オプションを記述することもできます。

#!/usr/local/bin/perl
#$ -S /usr/local/bin/perl
#$ -v LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH,PATH=$HOME/bin:$PATH

ただし、そうまでしてジョブスクリプトにて環境変数を設定しないことの是非を再検討してください。

参考: 特定のソフトウェアを実行するための環境変数の設定

R を実行したい

R スクリプトを作成します。

$ vi test.R
x <- matrix(1:12,3,4)
x

ジョブスクリプトを作成します。

$ vi test.sh
#!/bin/bash
#$ -S /bin/bash
#$ -cwd
Rscript test.R

ジョブスクリプトを qsub します。

$ qsub test.sh

関連: ジョブスクリプトの作成

ジョブを専有キューで実行したい

専有コアを持つグループのユーザは、専有キューをご利用いただけます。qsub 時にオプションを指定しない場合、SHIROKANE ではキューの使用状況に応じて mjobs.q、ljobs.q、lmem.q、専有キューのいずれかで実行されます。専有キューでのみ実行する際には、以下ようにオプションを指定してジョブを qsub する必要があります。

$ qsub -l exclusive [シェルスクリプト名]

専有キューは実行時間の上限がありません。ljobs.q が混み合っている際に、上記の通り指定することで、専有キューで実行時間の長いジョブを実行することができます。 専有キュー名 は、通常は、 グループ名.q です。 hgc0361 グループの場合は hgc0361.q になります。 ご自身のグループ名は、以下の id コマンドで表示されます。

$ id -gn