ページの先頭行へ戻る
Systemwalker Operation Manager  使用手引書
FUJITSU Software

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... 」が出力されます。詳細は、“B.5.10 ジョブ投入者のログインシェルがCシェルの場合の注意【UNIX版】”を参照してください。

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

ジョブスケジューラに登録するジョブのシェルスクリプト中で、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