Systemwalker Operation Manager 使用手引書 - UNIX/Windows(R)共通 -
目次 索引 前ページ次ページ

付録B 留意事項> B.6 ジョブスケジューラを使いこなすために

B.6.3 ジョブとしてシェルスクリプトを考える【UNIX版】

ジョブスケジューラはあるジョブネットについてそのシェルスクリプトやコマンドを自動的に起動することができます。また、ジョブネットおよび1つ1つのジョブについて状態を監視したり、履歴を見たりすることができます。

ジョブスケジューラに登録するジョブネットを構成するジョブ(ここではシェルスクリプト)として、どのようなシェルスクリプトを作るとジョブスケジューラが使いやすいかを考えます。

ある業務を行う際、いろいろな処理を、1つのシェルスクリプトに順番に盛り込みます。しかし、ジョブスケジューラを使う場合には、業務を監視したい処理単位にシェルスクリプトを分けます。そうすることにより、実行状態やログをその処理ごと(1つのシェルスクリプトごと)に見ることができるようになります。また、1つの業務を1つの大きなシェルスクリプトとして作る場合に比べて、デバッグが楽になります。

以下にジョブスケジューラに登録するシェルスクリプトを作る際に参考となることを挙げます。

なお、ジョブスケジューラ配下のジョブの実行時のシェルとしては、sh、ksh、またはcshを使ってください。bash等のフリーなシェルを使用すると、シェル自体が日本語表示をサポートしていないため、日本語が正しく出力されないことがあります。

■シェルスクリプトの終了コードを考え

ジョブネットが異常終了した際に出口ルーチンが起動されるシステムでは、出口ルーチンの処理を考慮して終了コードを決めます。

また、ジョブスケジューラに登録するシェルスクリプトおよびコマンドの終了コードは、200以下のコードにしてください。これは、ジョブスケジューラが、201から256までの終了コードを使用しているためです。ジョブスケジューラが使用する終了コードの意味については、“Systemwalker Operation Manager リファレンスマニュアル”の“ジョブスケジューラの終了コード”を参照してください。

■子孫シェルスクリプを考える

ジョブスケジューラに登録したシェルスクリプトの中から子シェルスクリプトを起動する場合、子プロセスの出力も参照できます。しかし、ジョブの状態表示はジョブスケジューラに登録したシェルスクリプトの状態を示していて、子プロセの状態とは関係ありません。登録されたシェルスクリプト自身が子プロセスの終了コードを意識して、親プロセ(登録されたシェルスクリプト)の終了コードとすれば、子プロセスの終了コードを知ることができます。

なお、子シェルスクリプト実行中に、親プロセスが終了してしまう場合の動作は保証できません。

シェル戦を考える

ジョブスケジューラのサーバ部を起動するシェルスクリプトには、SHELL環境変およびサーバ部起動コマンドが設定されています。ジョブスケジューラを導入した時のSHELL環境変数には以下の値が設定されています。

SHELL=/bin/ksh ; export SHELL         


SHELL環境変数の値を変更することにより、ジョブの実行時のシェルを指定することができます。以下のように、SHELL環境変数を設定しない場合は、ジョブネット登録者のログインシェがジョブ実行時のシェルとなります。

unset SHELL    

起動シェとしてshまたはkshを指定した場合は、.profileファイが読み込まれて実行されます。cshを指定した場合は、.cshrcファイおよび.loginファイルが読み込まれて実行されます。起動時に実行されるドットファイ(.付きファイル)の詳細については、それぞれのシェルの説明を参照してください。

JOBSCH_JOBNET環境変数が設定されている場合、ジョブはジョブスケジューラ配下で実行されます。

なお、ジョブ実行制御属性ジョブについては、ジョブ実行制御のシェル戦略に依存します。

ジョブの起動時に、ジョブネットが登録されているプロジェクトの、プロジェクト所有者のドットファイル(.付きのファイル)が読み込まれて実行されます。ジョブスケジューラのサーバ部起動時のSHELL環境変数に指定されたシェルのドットファイルか、ジョブネットが登録されているプロジェクトの、プロジェクト所有者のログインシェルのドットファイルを実行するのかについては、システム管理者のシェル戦略に依存します。ジョブスケジューラを導入した時のSHELL環境変数には、kshが指定されています。

ドットファイルの中で端末設定等の作業を行っている場合は、その部分が実行されないようにします。ジョブ実行制御属性のジョブも、ドットファイルの中の端末設定等の作業を行わないようにしておきます。以下に、.profileファイルの変更例を示します。この変更例では、端末設定をするコマンドとして、.profileファイルの中にsttyとeucsetが指定されています。

◆旧バージョン互換(旧・標準)属性のジョブを利用する場合

stty erase '^h' intr  '^c' echo cs8 -istrip imaxbel
eucset
             ↓
if [ " $JOBSCH_JOBNET " = "" ]
  then
    stty erase '^h' intr  '^c' echo cs8 -istrip imaxbel
    eucset
fi

◆ジョブ実行制御属性のジョブを利用する場合

stty erase '^h' intr  '^c' echo cs8 -istrip imaxbel
eucset
             ↓
if [ " $JOBSCH_JOBNET " = "" -a  " $ENVIRONMENT " = "" ]
  then
    stty erase '^h' intr  '^c' echo cs8 -istrip imaxbel 
    eucset
fi

ジョブの出力結果(前回履歴)に Warning: no access to tty; thus no job control in this shell... が出力されることについて

Cシェルが端末(tty)の属性を取得できない時に、「ジョブの出力結果(前回履歴)に Warning: no access to tty; thus no job control in this shell... 」が出力されます。詳細は、“ジョブ投入者のログインシェルがCシェルの場合”を参照してください。

■リモートシェの利用を考える

ジョブスケジューラに登録するジョブのシェルスクリプト中で、rshコマンを使用してリモートマシン上で実行する場合、以下のことに注意します。

rshコマンドの引数で指定したコマンドまたはシェルスクリプトを実行する場合、ジョブスケジューラに実行するディレクトリを指定したとしても、ジョブネット管理者のホームディレクトリで実行されます。特定のディレクトリで実行するジョブは、シェルスクリプト中でcdコマンドを用いてディレクトリを変更します。

rshコマンドの引数で指定したコマンドまたはシェルスクリプトが実行された時の出力は、ジョブスケジューラに表示されます。しかし、そのコマンドまたはシェルスクリプトの終了コード(exitコード)は表示されず、rshコマンドの終了コードが、ジョブスケジューラに表示される終了コードとなります。

シェルスクリプトの終了コードを表示する方法の1つとして、次のような場合があります。リモートマシン上で実行するシェルスクリプト中の最後で、その終了コードをファイルに書き込みます。ジョブスケジューラに登録されたシェルスクリプト(rshコマンドを含むシェルスクリプト)中の最後で、リモートマシン上にある終了コードを書き込んだファイルの中身を、exit関数に渡します。

例えば、マシンAからマシンB上にあるシェルスクリプトを実行させることを考えた場合、下の例に示すようなシェルスクリプトa.shをマシンA上に作成し、b.shをマシンBのホームディレクトリに作成しておきます。下の例ではマシンB上にあるシェルスクリプト“keisan”を実行します。

 

ジョブスケジューラに登録するコマンド:

a.sh keisan /work/keisan_result             

マシンA上のa.sh:

rsh B b.sh $1 $2; exit `rsh B "cat $2;rm $2" `       

マシンB上のb.sh:

$1 echo $? > $2                       


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 1995-2007