次の節では、Grid Engine システムでより複雑なジョブを発行する方法について説明します。
バッチジョブとも呼ばれるシェルスクリプトは、ファイル内でアセンブルされる一連のコマンド行命令です。スクリプトファイルは、 chmod コマンドによって実行可能になります。スクリプトを呼び出すと、コマンドインタプリタが起動されます。各命令は、スクリプトを実行するユーザーが手で入力しているかのように解釈されます。一般的なコマンドインタプリタには、csh、tcsh、 sh、または ksh があります。シェルスクリプト内からは、任意のコマンド、アプリケーション、およびその他のシェルスクリプトを呼び出すことができます。
コマンドインタプリタは、ログインシェルとして呼び出すことができます。このためには、ジョブを実行している特定のホストおよびキューに対して有効な Grid Engine システムの構成の login_shells リストに該当コマンドインタプリタの名前を含める必要があります。
Grid Engine システムの構成は、クラスタ内のさまざまなホストやキューによって異なる場合があります。有効な構成は、qconf コマンドの -sconf オプションと -sq オプションで表示できます。詳細は、qconf(1) のマニュアルページを参照してください。
コマンドインタプリタをログインシェルとして呼び出すと、ジョブの環境はスクリプトにログインして実行した場合と同じになります。たとえば、csh を使用すると、/etc/login などのシステムのデフォルト起動リソースファイル以外に .login と .cshrc が実行されます。一方、csh を login-shell として呼び出さなかった場合は、.cshrc だけが実行されます。login-shell として呼び出す場合と呼び出さない場合の違いについては、お使いのコマンドインタプリタのマニュアルページを参照してください。
例 3–1 に単純なシェルスクリプトを示します。このスクリプトは、まずアプリケーション flow を Fortran77 ソースからコンパイルしたあと、このアプリケーションを実行します。
#!/bin/csh # N1 Grid Engine 6.1 にある FORTRAN プログラムのサンプルを # コンパイルし、実行するスクリプトファイルの例 cd TEST # プログラム "flow.f" をコンパイルし、実行可能な "flow" を # ファイル名として命名する必要がある。 f77 flow.f -o flow |
ローカルシステムのユーザーズガイドには、シェルスクリプトの作成とカスタマイズに関する詳細情報が記載されています。sh、ksh、csh または tcsh のマニュアルページも参照してください。以降の節では、Grid Engine システム用のバッチスクリプトの作成時に、特に考慮すべき事柄を重点的に説明します。
一般的に、コマンドプロンプトから手動で実行できるすべてのシェルスクリプトは、Grid Engine システムに発行できます。 このシェルスクリプトは、端末接続や対話形式のユーザー介入を必要としてはなりません。ただし、自動的にリダイレクトされる標準エラーと標準出力デバイスは例外です。したがって、例 3–1 では Grid Engine システムへの発行準備が整っており、スクリプトは指定の処理を行います。
通常のシェルスクリプトを拡張すると、Grid Engine システムの制御下で実行されるスクリプトの動作に影響が出る場合があります。次の節では、これらの拡張機能について説明します。
図 3–5 に示すように、発行時には、ジョブスクリプトファイルの処理に使用するコマンドインタプリタを指定できます。何も指定しなかった場合、コマンドインタプリタの選択方法は構成変数 shell_start_mode によって決められます。
shell_start_mode が unix_behavior に設定されると、スクリプトファイルの 1 行目でコマンドインタプリタが指定されます。スクリプトファイルの 1 行目は、#! で始めてください。1 行目が #! で始まっていない場合、デフォルトでは Bourne シェル sh が使用されます。
shell_start_mode のその他のすべての設定では、デフォルトのコマンドインタプリタは、ジョブが開始されるキューの shell パラメータによって決まります。「キューとキュープロパティーの表示」とqueue_conf(5) のマニュアルページを参照してください。
バッチジョブには端末接続がないため、標準出力と標準エラー出力はファイルにリダイレクトしなければなりません。Grid Engine システムでは、出力のリダイレクト先となるファイルの場所を定義できます。出力ファイルが指定されていない場合は、デフォルトが使用されます。
ファイルの標準的な場所は、ジョブが実行される現在の作業ディレクトリです。デフォルトの標準出力ファイル名は job-name.o job-id で、デフォルトの標準エラーの出力先は job-name>.ejob-id にリダイレクトされます。job-name はスクリプトファイル名から作成するか、ユーザーが定義できます。たとえば、submit(1) のマニュアルページの -N オプションを参照してください。job-id は、Grid Engine システムによってジョブに割り当てられる一意の識別子です。
配列ジョブのタスクの場合 、タスクの識別子はドットで区切られて、これらのファイル名に追加されます。リダイレクト後の標準出力先パスは、 job-name.ojob-id.task-id> と job-name.e job-id.task-id になります。詳細は、「配列ジョブの発行」を参照してください。
標準の場所が適切でない場合は、 図 3–6 のように、QMON で出力先を指定できます。また、qsub コマンドの -e や -o オプションを使用して、出力先を指定することもできます。標準出力と標準エラー出力は、1 つのファイルにマージすることもできます。リダイレクトは、実行ホストごとに指定できます。その場合、ジョブが実行されるホストによって、出力するリダイレクトファイルの場所は異なります。一意のカスタマイズリダイレクトファイルパスを作成するには、qsub の -e および -o オプションと一緒に使用できるダミー環境変数を使用します。次にこれらの変数の一覧を示します。
ジョブを実行すると、これらの変数に実際の値が入り、その値でリダイレクトパスが作成されます。
詳細は、qsub(1) のマニュアルページを参照してください。
シェルスクリプトでは、ハッシュ記号 (#) が最初にある行はコメントとして扱われます。 ただし、Grid Engine システムは特別なコメント行を認識し、それらの行を特別な方法で使用します。そのような特別なコメントスクリプト行は、qsub コマンドのコマンド行引数リストの一部として扱われます。これらの特別なコメント行内で指定される qsub オプションも「QMON Submit Job」ダイアログボックスで解釈されます。スクリプトファイルを選択すると、対応するパラメータがプリセットされます。
デフォルトでは、特別なコメント行は #$ という接頭辞で識別されます。接頭辞は、 qsub -C コマンドで再定義できます。
このような特別なコメントの使用は、発行引数のスクリプト組み込みと呼ばれます。次に、スクリプト組み込みコマンド行オプションを利用したスクリプトファイルの例を示します。
#!/bin/csh # Grid Engine のデフォルトのシェルでなければ # csh を強制 #$ -S /bin/csh # これは N1 Grid Engine 6.1 の元でサンプルの FORTRAN プログラムを # コンパイルし、実行するスクリプトファイルの例です。 # Grid Engine に、ジョブの開始時と終了時に # メールを送信させるように # します。 #$ -M EmailAddress #$ -m b,e # 標準出力と標準エラーのためのファイルを # 命名します。 #$ -o flow.out -j y # ファイルがあるディレクトリに変更します。 cd TEST # プログラム "flow.f" をコンパイルし、 # 実行可能な "flow" と命名する必要があります。 f77 flow.f -o flow # コンパイルを完了すると、そのプログラムを実行できます。 flow |
ジョブが実行されると、いくつかの変数がジョブの 環境にプリセットされます。
ARC – ジョブが実行されているノードのアーキテクチャー名。この名前は sge_execd バイナリにコンパイルされます。
SGE_ROOT – Grid Engine システムのルートディレクトリ。起動する前に sge_execd で設定されたディレクトリ、またはデフォルトの /usr/SGE ディレクトリです。
SGE_JOB_SPOOL_DIR – ジョブの実行中にジョブ関連データを保存するために sge_shepherd が使用するディレクトリ。
SGE_CKPT_ENV – チェックポイント設定ジョブが実行されるチェックポイント設定環境。チェックポイント設定環境は、qsub -ckpt コマンドで選択されます。
SGE_CKPT_DIR – チェックポイント設定インタフェースの ckpt_dir パス。チェックポイント設定ジョブに対してのみ設定されます。詳細は、checkpoint(5) のマニュアルページを参照してください。
SGE_STDERR_PATH – ジョブの標準エラーストリームを出力するファイルのパス名。このファイルは、通常プロローグ、エピローグ、並列環境開始スクリプトおよび終了スクリプト、またはチェックポイント設定スクリプトからのエラーメッセージ出力を拡張するために使用されます。
SGE_STDOUT_PATH – ジョブの標準出力ストリームを出力するファイルのパス名。このファイルは、通常プロローグ、エピローグ、並列環境開始スクリプトおよび終了スクリプト、またはチェックポイント設定スクリプトからのメッセージ出力を拡張するために使用されます。
ENVIRONMENT – 常に BATCH に設定されます。この変数は、スクリプトがバッチモードで実行されることを示します。
JOB_ID – ジョブの発行時に sge_qmaster デーモンによって割り当てられる一意の識別子。ジョブ ID は、1 から 9,999,999 の 10 進法の整数です。
JOB_NAME – qsub コマンドで指定されたファイル名、ピリオド、およびジョブ ID の数字で構成されるジョブ名。このデフォルトは、qsub -N で無効にできます。
PE_HOSTFILE – Grid Engine システムによって並列ジョブに割り当てられた仮想並列マシンの定義を含むファイルのパス。 この変数は、並列ジョブでのみ使用されます。このファイルの形式については、「sge_pe」の $pe_hostfile パラメータの説明を参照してください。
REQUEST – ジョブの要求名。この名前は、ジョブスクリプトファイル名か、qsub -N コマンドによって明示的にジョブに割り当てられた名前です。
RESTARTED – チェックポイント設定ジョブが再開されたかどうかを示します。値が 1 に設定されている場合、ジョブは 1 回以上割り込まれています。よって、ジョブは再開されていることになります。
SHELL – passwd ファイルから得られるユーザーのログインシェル。
SHELL は、ジョブに使用されているシェルとは限りません。