4.5. ジョブ投入

ジョブの投入方法#

ジョブの投入には、pjsubコマンドを使用します。以下はジョブスクリプトjob.shを投入する場合の最も簡単な例です。

$ pjsub job.sh

ジョブの投入時には、ジョブに割り当てる資源量(ノード数、メモリ量など)をpjsubコマンドのオプションで指定できます。以下は、ジョブに割り 当てるノード数を指定して投入する例です。

[ジョブに8つのノードを割り当てる例]
$ pjsub -L "node=8" job.sh

指定できる資源量は、ジョブACL機能で許可されている範囲で指定できます。資源量を指定しない場合は、ジョブACL機能で設定されているデフォルト値が適用されます。ジョブの投入時に指定できるオプションについては、ジョブ投入時のオプション以降の説明およびpjsubコマンドのmanマニュアルを参照してください。

ジョブ投入に関する注意事項

  • pjsubコマンドで各システム(Armシステム/x86システム/GPUシステム)が対応していないオプションを指定した場合はエラーとなります。
  • 本サービスでは以下のpjsubコマンドのオプションは使用できません。システムの既定値が設定されます。
    • {-C|--dir-prefix} directiveprefix :ジョブスクリプト記述時のディレクティブプレフィックスを任意の文字に設定
    • -P "parameter=policy" :ノード選択ポリシーを指定
    • -p priority:投入するジョブの優先度を指定
    • --net-route value:Tofuインターコネクトのリンクダウン時に通信経路を変更するかどうかを指定
    • --script-delimiter delimiter :ステップジョブの複数のジョブスクリプトを指定するときの区切り文字(1文字)を指定

ジョブ投入時オプションのジョブスクリプト内での指定

pjsubコマンドのオプションは、コマンドラインだけでなく、ジョブスクリプトの中に記述できます。ただし、ジョブスクリプト内での指定よりもコマンドラインでの指定が優先されます。

ジョブスクリプトを指定しない場合は、pjsubコマンドの標準入力からジョブの内容が読み込まれます。

$ pjsub
#!/bin/bash    # ユーザーがpjsubの標準入力に対し、ジョブの内容を入力する
... 
<Ctrl+d>       # 標準入力を <Ctrl+d> キーで閉じる

ジョブが正常に受け付けられた場合、以下のメッセージが表示されます。

[INFO] PJM 0000 pjsub Job jobid submitted.

jobidは投入したジョブに対して設定されるIDです。投入したジョブにはジョブ名が設定され、デフォルトではジョブスクリプト名がジョブ名となります。ジョブ名を変更したい場合は、ジョブ投入時にpjsubコマンドの-Nまたは--nameオプションで指定できます。

ジョブ投入時のオプション#

pjsubコマンドの各種オプションを使用することで、ジョブに割り当てる資源やジョブの動作を指定することができます。ここでは利用可能なオプションについて説明します。

資源の指定#

pjsubコマンドの-Lオプションまたは--rsc-listオプションで、ジョブに割り当てる資源を指定できます。

{-L | --rsc-list } 項目=値

指定できる項目と値は以下の通りです。

  • 資源の指定書式
書式 説明
Armシステム/x86システム:
node=N

Armシステム:
node=shape[:strict][:ノード割り当て方法]
ジョブに割り当てるノード数。Armシステムでは、ノード形状およびノードの割り当て方法 (ノード割り当てジョブ用)の指定も可能です。詳細はノード/GPU資源の指定を参照してください。
GPUシステム:
gpu=N
ジョブに割り当てるGPU数。このオプションは後述のカスタム資源の1つです。使用するGPU数に応じて、仮想ノードとCPUコア数およびメモリ量が自動的に設定されます。詳細はノード/GPU資源の指定を参照してください。
elapse=limit ジョブの経過時間制限値(実行可能時間)。ジョブの経過時間の上限を limit で指定します。詳細はジョブの経過時間制限値の指定を参照してください。
node-mem=limit 1つのノードにおけるメモリ使用量の上限 (ノード割り当てジョブ用)。最小値は1MiB(Mi=2^30)です。
rscunit=name
ru=name
ジョブを投入するリソースユニット名。name は、63文字以内の文字列です。Armシステムには rscunit_ft01 、x86システムには rscunit_pg01 、GPUシステムには rscunit_pg02 を指定します。必ず指定する必要があります。
rscgrp=name
rg=name
ジョブを投入するリソースグループ名。name は、63文字以内の文字列です。利用可能なリソースグループについては、4.2 利用可能なリソースグループを参照してください。必ず指定する必要があります。
proc-core=limit 1つのジョブにおけるプロセスごとの最大コアファイルサイズ。
proc-cpu=limit 1つのジョブにおけるプロセスごとの最大CPU時間。最小値は1秒です。
proc-crproc=limit プロセスを実行しているノードおよび実ユーザーIDで生成できる最大プロセス数。
proc-data=limit 1つのジョブにおけるプロセスごとの最大データセグメントサイズ。
proc-lockm=limit 1つのジョブにおけるプロセスごとの最大ロックメモリサイズ。
proc-msgq=limit プロセスを実行しているノードおよび実ユーザーIDで確保できる最大POSIXメッセージキューサイズ。
proc-openfd=limit 1つのジョブにおけるプロセスごとの最大ファイルディスクリプタ数。
proc-psig=limit プロセスを実行しているノードおよび実ユーザーIDでの最大ペンディングシグナル数。
proc-filesz=limit 1つのジョブにおけるプロセスごとの最大ファイルサイズ。
proc-stack=limit 1つのジョブにおけるプロセスごとの最大スタックサイズ。
proc-vmem=limit 1つのジョブにおけるプロセスごとの最大仮想メモリサイズ。
CustomResourceName=Value カスタム資源の要求量または要求種別。CustomResourceName はカスタム資源名、Value はカスタム資源の数または種別です。"=Value" は省略できます。

指定する値limitは以下の表現形式で指定してください。

  • 資源量の表現形式
表現形式
時間 秒、分:秒、または時:分:秒の形式、または時 hms の形式で指定できます。hms は大文字も使えます。指定できる時間は、各リソースグループに設定されたジョブ実行時間上限内の時間です。
例:
elapse=100 (100秒)
elapse=1:40 (1分40秒)
elapse=6:10:30 (6時間10分30秒)
elapse=10h30m50s (10時間30分50秒)
elapse=300m (300分)
elapse=unlimited (制限なし)
メモリ量 (バイト) 2のべき乗を単位として表現します。
2のべき乗を示す単位は、Ki(キビ=2^10)、Mi(メビ=2^20)、Gi(ギビ=2^30)、Ti(テビ=2^40)、Pi(ペビ=2^50)で表現し、省略した場合は Mi が指定されたものとします。数値と2のべき乗を示す単位の間に空白は挿入してはいけません。指定できる値は特に断りがなければ 0Byteから 2147483647MiBまでです。無制限にする場合は unlimited を指定します。
例:
node-mem=256Mi (256MiB=256*2^20Byte)
node-mem=256 (同上)
node-mem=10Gi (10GiB=10*2^30Byte)
node-mem=unlimited (制限なし)
ディスク容量
ファイルサイズ (バイト)
10のべき乗を単位として表現します。
0のべき乗を示す単位は、K(キロ=10^3)、M(メガ=10^6)、G(ギガ=10^9)、T(テラ=10^12)、P(ペタ=10^15)で表現し、省略した場合は M が指定されたものとします。数値と10のべき乗を示す単位の間に空白は挿入してはいけません。指定できる値は特に断りがなければ 0Byteから 2147483647MBまでです。無制限にする場合は unlimited を指定します。
例:
node-quota=10M (10MB=10*10^6Byte)
node-quota=10 (同上)
node-quota=10G (10GB=10*10^9Byte)
node-quota=unlimited (制限なし)
数値 上記以外の資源量は、数値だけを指定します。
指定できる値は特に断りがなければ 0から 2147483647までです。無制限にする場合は unlimited を指定します。

これらの値は、ジョブACL機能で定義されている上限値を超える、または下限値を下回ることはできません。これらのオプションが指定されない場合は、ジョブACL機能で定義されているデフォルト値が適用されます。以下にジョブ資源の指定例を示します。

  • ジョブにノードを8台割り当てる例
$ pjsub -L "node=8" job.sh

ジョブは指定された数のノードで実行されます。指定されたノード数を超えて使用することはできません。例えば、複数のノードを必要とするMPIプログラムが割り当てられた数以上のノードを要求した場合、MPIプログラムがエラーで終了します。

  • ジョブの実行可能時間を86400秒(24時間)に設定する例
$ pjsub -L "elapse=86400" job.sh

ジョブ実行中に指定したジョブ実行可能時間を超えた場合、ジョブは強制終了させられます。

  • ジョブのノードごとの使用メモリの上限を256MiBに設定する例
$ pjsub -L "node-mem=256Mi" job.sh

ジョブはノードごとの使用メモリ上限の中で実行されます。ノード単位の使用メモリ制限値を超える要求はできません。

ここまでに説明したオプションを組み合わせた例を以下に示します。この例では、MPIプログラムprogを、割り当てノード数(2台)、実行可能時間(86400秒)、ノード単位の使用メモリの上限(256MiB)の制限値で投入します。制限値の指定はpjsubコマンドの引数ではなく、ジョブスクリプトjob.sh内に記述しています。

$ cat job.sh
#!/bin/bash
#PJM -L "rscunit=rscunit_pg01" # リソースユニット指定
#PJM -L "rscgrp=x86-medium"    # リソースグループ指定
#PJM -L "node=2"               # 割り当てノード数 2
#PJM -L "elapse=86400"         # 実行可能時間 86400秒
#PJM -L "node-mem=256Mi"       # ノード単位の使用メモリの上限 256MiB
...
mpiexec.hydra -n 4 ./prog                 # MPIプログラム prog を mpiexec コマンドで実行

$ pjsub job.sh


ノード/GPU資源の指定#

ジョブに割り当てるノード資源は、pjsubコマンドの-L (--rsc-list) オプションのnodeパラメーターで指定します。Armシステムおよびx86システムについては、nodeパラメーターで使用するノード数を指定してください。

GPUシステムについては、-L (--rsc-list) オプションのgpuパラメーターで使用するGPU数を指定してください。

  • ノード数の指定書式 [Armシステム/x86システム]
書式 説明
node=num 割り当てるノード数を指定します。
node パラメーターを指定しなかった場合、ノード数はジョブACL機能で定義されているデフォルト値に従います。pjacl コマンドで、pjsub option parameters の項目(node=)のdefault値を確認してください。

以下はジョブに8ノードを割り当てる場合の例です。

$ pjsub -L "node=8" job.sh
  • ノード形状を指定して割り当てる場合 [Armシステム]

    Armシステムでは、ノード数の指定の他にノード形状を指定してノード資源を指定することが可能です。ノード形状を指定することにより、ノード間の通信性能を安定させることができます。ユーザーはジョブ投入時にノード形状(1、2、または3次元形状)を指定します。ノード形状はpjsubコマンドの-Lまたは--rsc-listオプションのnodeパラメーターで指定し、実行中に存在するプロセスすべてを格納できる大きさである必要があります。

{-L | --rsc-list} "node=shape[:strict|:strict-io][:torus|:mesh|:noncont]"
  • ノード形状の指定書式
書式 説明
shape[:strict|:strict-io] shape はノード形状の次元に応じて、XX x Y 、または X x Y x Z のように各軸方向の大きさを指定します。
ノード形状が3次元の場合、 X x Y x Z:strict のように strict 指定ができます。これは、通常、空きノード空間に指定したノード形状が収まるように自動的に回転させてノードを割り当てますが、strict 指定の場合は回転させずに割り当てを試みます。2次元形状で同様な割り当てを行う場合は、3次元形状で表現して strict 指定を使用してください。
:torus
または
:mesh
または
:noncont
Tofu座標内でのノードの配置方法(トーラスモード、メッシュモード、離散割り当て)を指定できます。デフォルトは離散割り当てです。
torus はTofu単位(12ノード)で計算機資源をジョブに割り当てるトーラスモードを意味します。
mesh はノード単位で計算機資源をジョブに割り当てるメッシュモードを意味します。
noncont はノード単位で計算機資源をジョブに割り当てる離散割り当てを意味します。

ノード予約サービスに関する注意事項

ノード予約サービスのリソースグループでは、ノードの配置方法が離散割り当て(noncont)となります。トーラスモード(torus)とメッシュモード(mesh)は指定できません。

以下は、MPIプログラムprog_Aを実行するジョブに対し、3次元のノード形状(X 軸 4、Y 軸 3、Z 軸 2ノード)をトーラスモードで割り当てる例です。

$ cat job.sh    # MPIプログラム prog_A を実行するジョブスクリプト job.sh
#!/bin/bash
...
mpiexec ./prog_A

$ pjsub -L "node=4x3x2:torus" job.sh  #ノード形状 4x3x2 とトーラスモードを指定してジョブ投入

ノード形状指定に関する注意事項

指定するノード形状は、システムの最大形状を超えて指定できません。最大形状を超えた場合は、ジョブの投入がエラーになります。ノード形状がそのままでは最大形状をはみ出してしまうが、回転させることで収まるような場合は、自動的にノード形状の回転が行われます。ユーザーは回転させた形を指定する必要はありません。

  • GPU数の指定書式 [GPUシステム]

    GPUシステムに対しては、ノード数を指定する必要はありません。-L (--rsc-list) オプションのgpuパラメーターで使用するGPU数のみを指定してください。指定したGPU数に従って、自動的に仮想ノードが設定されます。

書式 説明
gpu=num 割り当てるGPU数を指定します。
指定したGPU数に応じて、自動的に仮想ノードのパラメータが設定されます。仮想ノード数は常に1であり、仮想CPUコア(vnode-core)には 8*GPU数が設定されます。仮想ノードあたりのメモリ量(vnode-mem)には 121856MiB*GPU数が設定されます。

以下はジョブに8GPUを割り当てる場合の例です。指定するGPUの数に応じて、仮想CPUコアと仮想ノードあたりのメモリ量が自動的に設定されます。

$ pjsub -L "gpu=8" job.sh

GPUシステムのノード専有方法

GPUシステムの資源割り当てはGPU単位であり、1台のコンピュートノード上で複数ユーザーのジョブが実行されます。そのため、他のユーザーからプロセス情報等が参照される可能性があります。他のユーザ―とコンピュートノードを共有せず、ノードを専有して利用したい場合、gpu=8を指定してください。この指定により、コンピュートノード上の全てのGPUが割り当てられるため、ノードを専有して利用できます。gpu=8を指定した場合は、実際に使用するGPU数に関わらず、8GPU分の課金が発生します。

Multi-Process Service(MPS)に関する注意事項

本サービスでは、MPS を使用するジョブはノードを専有する必要があります。MPS 使用時は実際に使用するGPU数に関わらず、gpu=8を指定してください。


ジョブの経過時間制限値の指定#

ジョブの投入時にジョブの経過時間制限値(実行可能時間)を以下の形式で指定できます。指定しなかった場合は、ジョブACL機能で設定されたデフォルト値が適用されます。

  • 経過時間制限値を指定
{-L | --rsc-list} elapse=limit

ジョブの経過時間がlimitに達するとジョブは強制終了させられます。ジョブ実行に必要な最小時間を指定することでジョブの実行開始が早まる場合があるため、必要最小限の時間を指定するようにしてください。設定した経過時間超過で強制終了したジョブは課金対象です。

ジョブが経過時間制限値に達して強制終了させられる場合、事前にシグナルが送信されます。ジョブが終了処理を実行するための猶予期間が設定されているため、必要に応じてジョブ内でシグナルを捕捉して終了処理を実行してください。

  • 経過時間の上限値(elapse=limit)を超過した場合、ジョブが強制終了させられる10秒前に、ジョブに対してシグナルSIGXCPUが送信されます。


ジョブ統計情報出力の指定#

pjsubコマンドの-sまたは-Sオプションで、ジョブの実行結果としてジョブ統計情報を出力できます。

{ -s | -S } [ --spath 出力先 ] 

-Sオプションは-sオプションよりも詳細な統計情報を出力します。両者の違いはmanマニュアルpjstatsinfo(7)を参照してください。

オプションの指定方法

-s-Sオプションの代わりに、それぞれロングオプション--stats--STATSも使用できます。

ジョブ統計情報は、ジョブ投入時のカレントディレクトリ配下のジョブ統計情報ファイル「ジョブ名.ジョブID.stats」に出力されます。この出力先を指定したい場合は、--spathオプションでファイル名を指定してください。ファイル名には以下の表記を使用できます。

  • ジョブ統計情報ファイル名の表記方法
書式 意味
%j ジョブID
%J サブジョブID
%b バルク番号
%s ステップ番号
%n ジョブ名

ファイルではなくメールによってジョブ統計情報を受け取りたい場合は、-mオプションを使用してください。

-m {s | S}

この場合の引数sおよびSは、それぞれ-sおよび-Sオプションと同じ意味になります。


メール通知の指定#

pjsubコマンドの-mオプションで、ジョブの実行結果をメールで通知することができます。

{ -m mailoption[,...] }

pjsubコマンドの--mail-listオプションで、メールの送信先を指定することができます。メールの送信先を指定しないとメールを受信できないため、メール通知を利用する場合は必ず送信先アドレスを指定してください。

{--mail-list mailaddress[,...] }

mailaddressにはメールアドレスを指定します。複数アドレス指定時はコンマ(,)で区切って指定します。指定可能な文字列のサイズは 255文字までです。

ジョブの開始時、終了時または再実行時に、その状態へ遷移したことをメールで通知できます。統計情報をメールで通知することも可能です。mailoptionに指定する記述を、以下に示します。複数オプション指定時はコンマ (",") で区切って指定します。統計情報の通知指定は、s/Sのどちらかを指定します。

  • 通常ジョブでのメールオプション
項目 説明
b (begin) ジョブの実行開始時
e (end) ジョブの終了時
r (restart) ジョブの再実行時
s (info) 統計情報の通知(ノード情報なし)
S (infonode) 統計情報の通知(ノード情報あり)
  • ステップジョブでのメールオプション

    bおよびrを指定した場合は、サブジョブ単位でメール通知されます。それ以外を指定した場合は、サブジョブ単位とジョブ単位の両方でメール通知されます。

項目 説明
b (begin) サブジョブの実行開始時
e (end) サブジョブの終了時
r (restart) サブジョブの再実行時
s (info) 統計情報とサマリ情報の通知(ノード情報なし)
S (infonode) 統計情報とサマリ情報の通知(ノード情報あり)
  • バルクジョブでのメールオプション

    バルクジョブでは、サブジョブ単位ではなく、ジョブ単位でメール通知されます。

項目 説明
b (begin) 最初のサブジョブの実行開始時
e (end) 最後のサブジョブの終了時
r (restart) メール通知なし
s (info) サマリ情報の通知(ノード情報なし)
S (infonode) サマリ情報の通知(ノード情報なし)

本オプションを指定しない場合、メール通知は行われません。

バルクジョブとステップジョブの統計情報

バルクジョブとステップジョブには、ジョブIDに対応する情報とサブジョブIDに対応する統計情報があります。前者を特にバルクジョブまたはステップジョブのサマリ情報と呼びます。


ジョブの自動再実行についての指定#

システムダウンなどでジョブの実行が中断された場合、自動的に再実行するかどうかをpjsubコマンドの--restartまたは--norestartオプションで指定できます。

  • 再実行可否の指定オプション
オプション 説明
--restart ジョブが異常終了した場合、自動で再実行します。
--norestart ジョブが異常終了しても、自動で再実行しません。

ジョブ再実行に関する注意事項

  • 会話型ジョブの自動再実行はできません。これらのオプションを指定した場合は無視されます。


実行開始時刻の指定#

通常、ユーザーが投入したジョブは、空き資源の状況や優先度に従って最も早く実行できるように順番が決定されますが、ユーザーによる実行開始時刻の指定も可能です。実行開始時刻はpjsubコマンドの--atオプションを使い、以下の書式で指定します。

書式 説明
--at YYYYMMDD[hhmm] YYYY は年、MM は月、DD は日を表します。
hh は時、 mm は分を表します。 hhmm を省略した場合は 0時0分が指定されたものとみなします。また、秒単位では指定できません。

以下は実行開始時刻を2022年10月3日15:11に指定してジョブを投入する例です。

$ pjsub --at 202210031511 job.sh

実行開始時刻指定時の注意事項

  • 実行開始時刻を指定したジョブは、資源に空きがあっても指定時刻より前に実行されることはありません。また、資源の空き状況によっては指定時刻より後に実行される場合があります。
  • 会話型ジョブに対しては、実行開始時刻は指定できません。指定した場合は無視されます。


バッチジョブの標準出力、標準エラー出力ファイルの指定#

バッチジョブの標準出力、標準エラー出力はファイルに出力されます。ファイル名は以下になります。

  • 標準出力: ジョブ名.ジョブID.out
  • 標準エラー出力: ジョブ名.ジョブID.err

ファイル名を指定したい場合、pjsubコマンドの-oおよび-eオプションを使用します。また、標準エラー出力を標準出力に向ける場合は-jオプションを指定します。

  • バッチジョブの標準出力、標準エラー出力ファイルの指定
書式 説明
-o filename ジョブの標準出力をファイル filename に出力します。
-e filename ジョブの標準エラー出力をファイル filename に出力します。
-j ジョブの標準エラー出力を標準出力に向けます。

オプションの指定方法

-o-eオプションの代わりに、それぞれロングオプション--out--errオプションも使用できます。

出力ファイル名の指定では、以下の表記を使用できます。

  • 出力ファイル名形式の指定
表記 意味
%j ジョブID
%J サブジョブID
%b バルク番号
%s ステップ番号
%n ジョブ名

以下はこの表記を使用した出力ファイル名の指定例です。

$ pjsub -o '%j[%b].stdout' -e '%j[%b].stderr'

この例では、ジョブID 100のバルクジョブで、バルク番号 10のサブジョブの標準出力ファイル、標準エラー出力ファイルが、100[10].stdout と 100[10].stderr になります。

出力ファイルに関する注意事項

  • バルクジョブやステップジョブに対して各サブジョブの出力先を同じファイルにした場合、ファイル内で各サブジョブの出力が混在します。このため、出力結果からサブジョブごとの出力を読み取れない可能性があります。
  • 会話型ジョブでは、pjsubオプションの-o-eオプションの指定はできません。
  • Armシステム上で実行するジョブ内でmpiexecコマンドを実行すると、その標準出力および標準エラー出力は、mpiexecコマンドのオプションで指定しなければジョブACL機能の項目mpiexec-*で定義されるファイルへ出力されます。これにより、ジョブの標準出力および標準エラー出力ファイルは、pjsubコマンドの-o-eオプションで指定したファイルのほかにも作成されることがあります。

Armシステムにおけるmpiexecの出力ファイル

Armシステムにおけるmpiexecコマンドの標準出力および標準エラー出力については、Development Studioマニュアルの MPI使用手引書を参照してください。

ジョブ種類毎の投入方法#

通常ジョブ以外のジョブは、その種類によって固有の指定が必要です。ここではジョブの種類による指定方法の違いについて説明します。

バルクジョブの投入方法#

ジョブがバルクジョブであることを宣言するために、pjsubコマンドの--bulkオプションを指定します。また、バルクジョブとして投入したいサブジョブの数を、--sparamオプションを使用して、バルク番号の開始、終了で示します。

$ pjsub --bulk --sparam "開始バルク番号-終了バルク番号" [ジョブスクリプト]

バルク番号は 0から 999999まで指定でき、終了バルク番号は開始バルク番号より大きくなければいけません。バルク番号は1ずつ増加します。

以下に、データファイルがin-0.datからin-9.datまで10種類あり、それぞれを入力としてプログラムを実行する場合のバルクジョブの投入例を示します。バルクジョブに関する部分だけを示しています。

$ cat bulkjob.sh
#!/bin/bash
...
INFILE=in-${PJM_BULKNUM}.dat     # バルク番号から入力データファイル名を決定
OUTFILE=out-${PJM_BULKNUM}.dat   # バルク番号から出力データファイル名を決定
./program ${INFILE} ${OUTFILE}   # 入出力データファイルをプログラムの引数に指定
...
$ pjsub --bulk --sparam "0-9" bulkjob.sh   # バルク番号を 0から 9まで指定し、bulkjob.shを投入


ステップジョブの投入方法#

ジョブがステップジョブであることを宣言するために、pjsubコマンドの--stepオプションを指定します。ステップジョブでは、どのステップジョブのサブジョブかを示すために、ジョブIDまたはジョブ名を指定します。

  • ジョブIDを指定する方法

    ステップジョブのジョブIDを指定してサブジョブを投入します。この場合、1番目のサブジョブと2番目以降のサブジョブでは、投入時のオプションに違いがあります。

  • 1番目のサブジョブ投入

$ pjsub --step stepjob1.sh
[INFO] PJM 0000 pjsub Job 100_0 submitted.
  • 2番目以降のサブジョブ投入

    1番目のサブジョブと同じステップジョブであることを示すために、--sparam "jid="オプションで、ジョブIDを指定して投入します。

$ pjsub --step --sparam "jid=100" stepjob2.sh
[INFO] PJM 0000 pjsub Job 100_1 submitted.

1番目のサブジョブがすでに終了している場合は、該当するジョブが存在しないため、サブジョブの投入がエラーになります。


ジョブ名を指定する方法#

各サブジョブのジョブ名に同じ名前を設定し、ジョブ名を指定してサブジョブを投入します。この方法では、1番目と2番目以降のサブジョブの投入方法は基本的に同じにできます。

  • 1番目のサブジョブ投入

    サブジョブの投入時に、--sparam "jnam="オプションを指定することでジョブ名を設定します。

$ pjsub --step --sparam "jnam=mystepjob" stepjob1.sh
[INFO] PJM 0000 pjsub Job 200_0 submitted.
  • 2番目以降のサブジョブ投入

    --sparam "jnam="オプションで、ジョブ名を設定すると同時に、すでに存在する同名のステップジョブのサブジョブを指定します。

$ pjsub --step --sparam "jnam=mystepjob" stepjob2.sh
[INFO] PJM 0000 pjsub Job 200_1 submitted.

該当するジョブ名のステップジョブが存在しない場合は、新規ステップジョブが生成されます。

オプションの注意事項

  • --sparam "jnam="オプションを指定した場合-Nまたは--nameオプションの有無に関係なく、--sparam "jnam="オプションで指定したジョブ名がサブジョブに設定されます。
  • pjsubコマンドに--sparam "jnam="オプションを指定した場合は、ジョブスクリプト内での--sparam "jnam="オプションの指定は無視されます。
  • --sparam "jnam="オプションを指定せずに投入したステップジョブに対して、ジョブ名を指定してサブジョブを投入するときは、最初のサブジョブ(ステップ番号0)のジョブ名を指定してください。
  • --sparam "jnam="オプションを使用せず、-Nまたは--nameオプションでジョブ名を指定した場合は、新規のステップジョブが生成されます。このため、同じジョブ名の異なるステップジョブが複数存在する場合があります。このとき--sparam "jnam="オプションでジョブ名を指定してサブジョブを投入すると、最後に生成されたステップジョブを指定したものとみなされます。

投入したサブジョブのステップ番号は、指定がなければ投入順に 0から 1ずつ増えます。ステップ番号は--sparam "sn="オプションでユーザーが指定できます。

$ pjsub --step --sparam "sn=10" stepjob1.sh  # ステップ番号を10に設定

ユーザーがステップ番号を指定する場合、その時点での最大ステップ番号より大きい値である必要があります。ステップ番号はpjstatコマンドで確認できます。1つのステップジョブに対する複数のサブジョブは、コンマまたは空白で区切ってpjsubコマンドでまとめて投入できます。

$ pjsub --step stepjob1.sh,stepjob2.sh
または
$ pjsub --step stepjob1.sh stepjob2.sh 
[INFO] PJM 0000 pjsub Job 300_0 submitted.
[INFO] PJM 0000 pjsub Job 300_1 submitted.

上記の場合、ステップ番号はジョブスクリプトを指定した順に 0、1、...と設定されます。--sparam "sn="オプションを指定した場合は、指定値を起点としてステップ番号が設定されます。

また、すでに存在するステップジョブに対して、複数のサブジョブをまとめて投入できます。

$ pjsub --step stepjob1.sh
[INFO] PJM 0000 pjsub Job 400_0 submitted.
$ pjsub --step --sparam "jid=400" stepjob2.sh,stepjob3.sh
または
$ pjsub --step --sparam "jid=400" stepjob2.sh stepjob3.sh
[INFO] PJM 0000 pjsub Job 400_1 submitted.
[INFO] PJM 0000 pjsub Job 400_2 submitted.

複数のサブジョブを投入する場合の注意事項

  • pjsubコマンドの引数で指定したオプションは、同時に投入するすべてのサブジョブに対する共通の指定になります。サブジョブごとに異なる指定をしたい場合は、ジョブスクリプト内で指定してください。ただし、ジョブ名、ジョブIDおよびステップ番号の指定については以下に注意してください。
    • サブジョブごとにジョブ名を変えたい場合は、ジョブスクリプト内で-Nまたは--nameオプションを指定してください。ジョブスクリプト内で--sparam "jnam="オプションを指定する場合は、同時に投入するすべてのジョブスクリプト内で--sparam "jnam="オプションが指定され、ジョブ名は同じである必要があります。
    • 同時にジョブ投入を指定した複数のジョブスクリプト内で、ステップジョブのジョブIDを指定する--sparam "jid="オプションを指定した場合は、最初に指定したジョブスクリプトの指定が有効になります。
    • ステップ番号を指定する--sparam "sn="オプションをpjsubコマンドの引数で指定した場合は、最初のサブジョブに対するステップ番号の指定になり、それ以降のサブジョブに対してはステップ番号は 1ずつ増加します。
  • サブジョブの標準出力ファイル、標準エラー出力ファイル、およびジョブ統計情報出力ファイルを指定する場合は、ファイル名の書式にステップ番号を含めるなどして、サブジョブごとに異なるファイルにしてください。同じファイル名の場合は、最後のサブジョブの出力で上書きされます。

ジョブスクリプト名に関する留意事項

ジョブスクリプトのファイル名にコンマ(,)を使用する場合、コンマが区切り文字として解釈されないように、pjsubコマンドの--script-delimiterオプションにnoneを指定してください。

$ pjsub --script-delimiter none --step step,job1.sh

2番目以降のサブジョブ投入時は、先行するサブジョブの結果に応じてどういう動作をするかを--sparam "sd="オプションで指定できます。これをステップジョブの「依存関係式」と呼びます。依存関係式の指定方法は以下の書式となります。

--sparam "sd=form[:[deletetype][:stepno[:stepno[...]]]]"

formは投入するサブジョブを実行するかどうかを判断する条件を示します。deletetypeはサブジョブを実行しない場合の詳細動作の指定です。stepnoは式formをどのサブジョブの実行結果に対して適用するかを示すステップ番号です。stepnoを省略すると、直前のサブジョブの結果が対象となります。

form、削除タイプdeletetypeに指定できる値は以下のとおりです。

式 form 説明
NONE 依存するサブジョブはないことを示します。つまり、"sd=" を指定をしない場合と同じです。投入するサブジョブは先行するサブジョブが終了すると実行されます。
注) ただし、先行するサブジョブで後続のサブジョブを削除した場合は実行されません。
param==値
param!=値
param>値
param<値
param>=値
param<=値
deletetype の指定に従ってサブジョブを削除する(実行しない)ための条件を示します。paramec または pc で、それぞれ以下を意味します。
ec :依存するサブジョブのジョブスクリプトの終了ステータス
pc :依存するサブジョブのジョブ終了コード(PJM コード)
条件 ==!= の場合、値はコンマ (,) で区切って複数指定できます。

ジョブスクリプトの終了ステータス(ec)とジョブ終了コード(pc)の違い

ジョブ終了コードpcは、ジョブ運用管理機能が正常にジョブを処理できたかどうかを表すコードです。ジョブスクリプトの終了ステータスecが 0以外であっても、ジョブとして正常に処理された場合は、ジョブ終了コードは 0になります。ジョブとして正常に処理できなかった場合、ジョブスクリプトの終了ステータスが 0でも、ジョブ終了コードが 0以外になる場合があります(例:経過時間制限超過)。

ユーザーは、ジョブ終了コードpcとジョブスクリプトの終了ステータスecの違いを意識して依存関係式を考える必要があります。

削除タイプ deletetype 説明
one このサブジョブだけ削除します。このサブジョブの結果に依存する後続のサブジョブは削除されません。deletetype を省略した場合は one が指定されたものとみなします。
after このサブジョブ、およびそれに依存する後続のサブジョブだけ削除します。
all このサブジョブ、および後続のサブジョブをすべて削除します。

以下は、ジョブID 500のステップジョブに対するサブジョブとして投入する例です。この例では、ステップ番号 0のサブジョブのジョブスクリプトの終了コードが 0以外の場合、このサブジョブ以降の後続のサブジョブは実行しないものとします。

$ pjsub --step --sparam "jid=500,sd=ec!=0:all:0" stepjob2.sh

オプション指定時の注意事項

--sparamオプションの引数は、1つの文字列となるようにシングルクォートまたはダブルクォートで囲んでください。

1つのステップジョブで、サブジョブを異なるリソースユニットやリソースグループに投入できます。この場合、サブジョブの投入先リソースユニット名やリソースグループ名を指定する必要があります。

以下は、ステップ番号1と3のサブジョブをリソースユニットrscunit_pg01、リソースグループx86-mediumに投入し、ステップ番号2のサブジョブをリソースユニットrscunit_ft01、リソースグループarm-mediumに投入する例です。

$ pjsub --step -L "rscunit=rscunit_pg01" -L "rscgrp=x86-medium" --sparam "sn=1" job-x86-1.sh
[INFO] PJM 0000 pjsub Job 600_1 submitted.
$ pjsub --step -L "rscunit=rscunit_ft01"  -L "rscgrp=arm-medium" --sparam "jid=600,sn=2,sd=ec!=0:after:1" job-arm.sh
[INFO] PJM 0000 pjsub Job 600_2 submitted.
$ pjsub --step -L "rscunit=rscunit_pg01"  -L "rscgrp=x86-medium" --sparam "jid=600,sn=3,sd=ec!=0:all:1:2" job-x86-2.sh
[INFO] PJM 0000 pjsub Job 600_3 submitted.


ワークフロージョブの投入方法#

ワークフロージョブは、複数のジョブの投入をユーザーが制御する方法です。ユーザーは複数のジョブを投入するシェルスクリプトを作成し、それを実行します。

ワークフロージョブは、ジョブ単位での実行制御(条件分岐や繰り返し)をする複数のジョブのまとまりであり、ステップジョブと同様に、あるジョブの実行結果に応じて次に実行するジョブが決まるような場合で利用します。実行制御をするシェルスクリプトの内容次第で、ステップジョブより自由度が高い制御が可能です。

ワークフロージョブの定義

ワークフロージョブは正確にはジョブの種類ではなく、複数のジョブの投入をシェルスクリプトによってユーザーが制御する方法のことです。


会話型ジョブの投入方法#

ジョブが会話型ジョブであることを宣言するために、pjsubコマンドの--interactオプションを指定します。

会話型ジョブには、ユーザーが端末からジョブの内容を対話的に入力する方法と、バッチジョブと同じようにジョブスクリプトでジョブの内容を指定する方法があります。pjsubコマンドの引数にジョブスクリプトを指定しない場合は、ジョブの内容を対話的に入力する方法となり、擬似端末上でシェルが起動され、入力待ちの状態となります。

$ pjsub -L "rscunit=rscunit_ft01,rscgrp=arm-small,node=1" --interact
[INFO] PJM 0000 pjsub Job 405916 submitted.              # 会話型ジョブ投入を示すメッセージ
[INFO] PJM 0081 .connected.                              # 会話型ジョブの準備中を示すメッセージ
[INFO] PJM 0082 pjsub Interactive job 405916 started.    # 会話型ジョブ開始を示すメッセージ
$                                                        # 会話型ジョブ内のシェルプロンプト
...
$ exit                                                   # シェルの終了
[INFO] PJM 0083 pjsub Interactive job 405916 completed.  # 会話型ジョブ終了を示すメッセージ

このときのプロンプトは、会話型ジョブを実行するコンピュートノード上のシェルが表示しているものです。コンピュートノードでのカレントディレクトリは、ログインノードで pjsubコマンドを実行した際のカレントディレクトリと同じパスになります。シェルを終了させるか、pjdelコマンドでジョブを削除すると、会話型ジョブは終了します。

擬似端末からの入力は会話型ジョブで実行しているシェルに渡されますが、会話型ジョブに対して特別な動作を指示するには、エスケープ文字としてチルダ記号'~'を使用します。チルダ記号とそれに続く入力によって以下の動作を指示できます。なお、エスケープ文字としてのチルダ記号は、改行後の最初の文字でなければいけません。

  • 会話型ジョブにおけるエスケープ
入力 動作
~~ チルダ記号をシェルに送ります。
~. 会話型ジョブを終了します。会話型ジョブで実行していたシェルは終了し、擬似端末は切断されます。
~ 会話型ジョブを実行している pjsub コマンドをサスペンドし、pjsub コマンドを実行したコマンドラインに端末制御を戻します。pjsub コマンドをフォアグラウンドに戻すことで会話型ジョブを継続します。
~? エスケープの一覧を表示します。

pjsubコマンドの引数にジョブスクリプトを指定する場合は、バッチジョブと同様にジョブスクリプトの内容に従って実行されます。

$ pjsub -L "rscunit=rscunit_ft01,rscgrp=arm-small,node=1" --interact interactjob.sh
[INFO] PJM 0000 pjsub Job 405918 submitted.
[INFO] PJM 0081 .connected.
[INFO] PJM 0082 pjsub Interactive job 405918 started.
...   # ジョブスクリプトの出力内容
[INFO] PJM 0083 pjsub Interactive job 405918 completed.

資源不足によって会話型ジョブがすぐに実行できない場合、資源割り当て待ちになり、後続のジョブ実行に影響が出る可能性があります。このため、会話型ジョブでは資源割り当て最長待ち時間(秒)を--sparam "wait-time="オプションで指定できます。資源割り当て待ちが指定した時間を超えた場合は、ジョブはキャンセルされます。

以下は資源割り当て待ちを最長600秒(10分)待つ場合の例です。

$ pjsub -L "rscunit=rscunit_ft01,rscgrp=arm-small,node=1" --interact --sparam "wait-time=600" 
[INFO] PJM 0000 pjsub Job 291 submitted.
[INFO] PJM 0081 .
[INFO] PJM 0080 pjsub Interactive job 291 is canceled due to the resource allocation timeout.
       The timeout period "t" can be specified by "--sparam wait-time=t". 
       待ち時間が600秒を超えたためキャンセルされた

会話型ジョブでは、pjsubコマンドの以下のオプションは無視されます。

  • 会話型ジョブで無視されるpjsubコマンドのオプション
オプション 説明
--at ジョブ実行開始時刻の指定
-e、--err 標準エラー出力ファイルの指定
-j 標準エラー出力を標準出力ファイルに向ける
--bulk, --step ジョブモデルの指定
-m e 実行終了のメール通知の指定
-m r 実行再開のメール通知の指定
--restart ジョブの自動再実行の有効化
-o、--out 標準出力ファイルの指定
-w pjsub コマンドの復帰待ち合わせ

会話型ジョブ終了時の注意事項

会話型ジョブを実行した際、Ctrl+C を入力後にexitで会話型ジョブを終了すると、通常の終了メッセージの前に以下のメッセージ[INFO]PLE 0094が表示されますが、動作には問題ありませんので無視してください。

[INFO] PLE 0094 plexec The interactive job has received the signal.(sig=2)
[INFO] PJM 0083 pjsub Interactive job 405920 completed.