4.4. ジョブスクリプトの作成

通常ジョブのジョブスクリプト#

通常ジョブは、最もシンプルな構造のジョブです。1つのジョブスクリプトを実行し、それが終了するとジョブが終了します。

ジョブスクリプトはシェルスクリプトとして記述されます。以下にジョブスクリプトの記述例を示します。

#!/bin/bash                    # bashで実行されるジョブスクリプト
#PJM -L "node=1"               # 利用するノード数を指定
#PJM -L "rscunit=rscunit_pg01" # リソースユニットの指定
#PJM -L "rscgrp=x86-small"     # リソースグループの指定
#PJM -N "normaljob"            # ジョブ名の指定
#comment                       # PJMで始まらない場合はシェルのコメント

export PATH=<dirname>:$PATH    # 環境変数の設定など

#PJM -L "elapse=86400"         # ジョブの経過時間制限値の指定
./a.out                        # プログラム a.out を実行

ジョブスクリプト記述時の注意事項

  • ジョブスクリプトを実行するシェルは、ジョブスクリプトの1 行目に #! でシェルが指定されていなければ、ユーザーのログインシェルになります。
  • ジョブスクリプト内で#PJMで始まる行には、ジョブを投入するときのpjsubコマンドの引数を記述できます。ジョブスクリプト内での指定より、pjsubコマンドの引数による指定の方が優先されます。
  • 一度コメント行以外が現れても、#PJMで始まる行はジョブを投入するときのpjsubコマンドの引数として解釈されます。
  • ジョブスクリプトにはジョブを投入するユーザーに対する読込み権が必要です。実行権は不要です。
  • ジョブスクリプト内で、/dev/stdoutまたは/dev/stderrにリダイレクトを行わないでください。リダイレクトした場合、標準出力ファイルまたは標準エラー出力ファイルが先頭から上書きされます。

バルクジョブのジョブスクリプト#

バルクジョブでは、サブジョブごとにジョブの入力パラメーターを変えられるようにジョブスクリプトを作成する必要があります。このために、サブジョブごとに設定されるバルク番号を使います。バルク番号はサブジョブ内で、環境変数PJM_BULKNUMに設定されています。以下は、バルクジョブのジョブスクリプトの記述例です。

#!/bin/bash              
#PJM -L "node=1"
#PJM -L "rscunit=rscunit_pg01"
#PJM -L "rscgrp=x86-small"
#PJM -N "bulkjob"

export PATH=<dirname>:$PATH

IN_DATA=./indata.${PJM_BULKNUM}   # バルク番号を使って入力データファイル名を決定
OUT_DATA=./outdata.${PJM_BULKNUM} # バルク番号を使って出力データファイル名を決定
prog -i ${IN_DATA} -o ${OUT_DATA} # プログラム prog の引数で入出力データファイルを指定して実行

ステップジョブのジョブスクリプト#

ステップジョブでは、先に実行したサブジョブの終了コードに基づいて次のサブジョブの動作を変更します。このため、必要に応じて複数のサブジョブの終了コードを設けるようにします。ステップジョブの投入時は、サブジョブの終了コードに応じた次のサブジョブの実行条件を指定します。

ステップジョブでは、サブジョブごとに設定されるステップ番号を使うことが可能です。ステップ番号はサブジョブ内で、環境変数PJM_STEPNUMに設定されています。以下は、ステップジョブのジョブスクリプトの記述例です。

#!/bin/bash
#PJM -L "node=1"
#PJM -L "rscunit=rscunit_pg01"
#PJM -L "rscgrp=x86-small"
#PJM -N "stepjob"

export PATH=<dirname>:$PATH

INNUM=${PJM_STEPNUM}            # INNUMにはステップ番号 0 が格納される
OUTNUM=$((PJM_STEPNUM+1))       # OUTNUMには 1 が格納される

# 前のジョブの出力をステップジョブの入力にする
IN_DATA=./indata.${INNUM}        # INNUMを使って入力データファイル名を決定
OUT_DATA=./outdata.${OUTNUM}      # OUTNUMを使って出力データファイル名を決定
prog -i ${IN_DATA} -o ${OUT_DATA} # プログラム prog の引数で入出力データファイルを指定して実行

会話型ジョブのジョブスクリプト#

会話型ジョブはインタラクティブにジョブを実行するジョブです。利用するジョブスクリプトは通常ジョブと同様です。ジョブ投入時に--interactオプションを指定することで、会話型ジョブとして実行できます。

#!/bin/bash
#PJM -L "node=1"
#PJM -L "rscunit=rscunit_pg01"
#PJM -L "rscgrp=x86-small"
#PJM -N "interactivejob"

export PATH=<dirname>:$PATH

./a.out                        # プログラム a.out を実行

会話型ジョブのジョブスクリプト記述時の注意事項

  • ステップジョブおよびバルクジョブの実行はできません。
  • 標準出力および標準エラー出力はジョブ実行スクリプト内での指定はできません。会話型ジョブを実行するターミナルの設定に従います。
  • メール通知/優先度/時刻指定/復帰待ち合わせによるジョブの実行やジョブの再実行の有効化はできません。

Singularityのジョブスクリプト#

Singularityとは、HPC向けのコンテナ仮想化ソフトウェアです。ジョブ実行環境のDockerモードによるジョブとしてSingularityを実行できます。本サービスでは、jobenv=singularityを指定することで、Singularityを使用したジョブを実行できます。

Singularityで使用するSIF(Singularity Image Format)ファイルはユーザー側で任意のファイルを取得し、singularityコマンドの引数として指定してください。

Singularityの使い方の詳細については、6.8. Singularityをご参照ください。

#!/bin/bash
#PJM -L "node=1"
#PJM -L "rscunit=rscunit_pg01"
#PJM -L "rscgrp=x86-small"
#PJM -L "jobenv=singularity"
#PJM -N "singularityjob"

export PATH=<dirname>:$PATH

# SingularityによりUbuntuを起動して a.out を実行
singularity exec ubuntu_22.04.sif ./a.out