ジョブの起動から終了まで
スレッドについて理解したところでもう一度ジョブについて説明することにします。- 1 ジョブの起動方法
-
ジョブの起動方法についてマニュアルの内容の引用すると
ジョブの起動方法には、次の3通りの方法があります。
- RUNコマンドによる起動
- 初期プログラムによる起動
- メニューによる起動
[システム管理説明書(2009年11月版)−2.4.1 ジョブの起動方法]よりとのことです。
- 1.1 RUNコマンドによる起動
-
RUNコマンド入力行でRUNコマンドを入力してジョブを起動・実行する方法です。
Windowsでいうとコマンドプロンプトからxxx.exeやxxx.batを実行する、あるいはLinuxでいうとシェルからプログラムをシェルコマンドでプログラムを実行するということです。A−VXのRUNコマンドは、WindowsのコマンドやLinuxのシェルと比べると圧倒的に種類や機能が少ないです。
例えば、RUNコマンド行で#ABCという名前のプログラム(ジョブ)を実行する場合は、RUNコマンド行に「#ABC;」と入力して実行キーを押します。
NECの公式マニュアル:システム管理説明書によると、RUNコマンドの形式には3つあることになっています。
- 形式1:「#ABC;」とか「#ABC,DEV=MSD000,FIL=SYS@LML;」のような一般的なRUNコマンドの形式
- 形式2:SYSIN = 装置名;
- 形式3:pp [,SIU=装置名] 「ADVANCEキー」
形式1はよく使う形式です。あとで詳しく説明します。
形式3はあらかじめロードモジュールに2桁の番号をつけておいて、その番号でジョブを実行する方法。ロードモジュールしか実行できません。滅多に使わない。
形式2はとっても古い形式で今は使えません。いにしえの紙カードとかで使っていた形式です。なんで今もマニュアル上に記載を残しているのか意味不明。
一般的には端末で操作開始コマンドや画面切離コマンドを入力すると業務プログラムや業務メニューが表示されるように、初期プログラムを設定しているはずです。なので通常はRUNコマンドを使ってジョブを実行するということはないはずです。
RUNコマンド使用してジョブを実行するのはシステムをメンテする場合とかに限られると思います。
- 1.2 初期プログラムによる起動
-
通常はいちいちRUNコマンドを入力して業務プログラムを実行するということはしません。端末を起動したり、操作開始コマンドを入力したりした時に自動的に業務プログラムや業務メニューを画面に表示するような仕組みになっているはずです。
初期プログラムとは端末を起動したり、操作開始コマンドを入力したりした時に自動的に実行する業務プログラムや業務メニューのことをいいます。
オペレータコントロールファイル(OCF)に初期プログラムを設定したり、端末(ワークステーション)に初期プログラムを設定したりできます。OCFに初期プログラムを設定すると、オペレータごとに自動的にプログラムを実行することができます。例えば経理部の人が操作開始したら経理部門用の業務プログラムが自動的に立ち上がる、人事部の人が操作開始したら人事部門用の業務プログラムが自動的に立ち上がる、生産管理部の人が操作開始したら生産管理部門用の業務プログラムが自動的に立ち上がる・・・のようにできます。
端末(ワークステーション)に設定した初期プログラムをワークステーション対応初期プログラムといいます。
端末ごとに自動的にプログラムを実行することができます。例えば端末aで操作開始したら業務プログラムaが自動的に立ち上がり、端末bで操作開始したら業務プログラムbが自動的に立ち上がる・・・のようにできます。
経理部に端末を1台設置、人事部に端末を1台設置、生産管理部に端末を1台設置・・してそれぞれの端末に専用のプログラムを設定するという使い方を想定しているのだと思います。ワークステーション対応初期プログラムにはOCFと組み合わせることもできるので、特定の端末で特定の人が操作開始したら・・・のように複雑なパターンも可能です。
上では操作開始コマンドのパターンで説明しましたが、NECのマニュアルに記載の通り、画面切離コマンド等でも初期プログラムが起動します。
他にもいろいろな初期プログラムがあり、自動電源制御されたシステムで使用できる初期プログラム(システム初期プログラム)や優先処理用の初期プログラムといったものもあります。
きちんと初期プログラムを設定すれば、権限のない業務プログラムは実行できなくなります。ということは不必要にファイルにアクセスしたりもできなくなるということなので、適切に初期プログラムを設定することによって、セキュリティも向上するということになります。
- 1.2 メニューによる起動
-
メニューでジョブを選択して実行する方式です。
A−VXはメニュー操作が基本なので、システムとしてメニューが用意されていて、メニューをカスタマイズして自社用の業務メニューを作ることができます。
カスタマイズした業務メニューに業務プログラムを登録しておき、必要な業務プログラムを選択して実行するというような形になります。実際は上で説明した初期プログラムに業務メニューを設定しておいて、操作開始コマンドを入力したら自動的に業務メニューを画面に表示する、というような使い方になると思います。
メニューから子メニュー、孫メニューを開くというようなこともできるので、大分類→中分類→小分類へとメニューをたどっていくこともできます。
メニューもいくつかのタイプが用意されており、数字で選択するもの、数字の他にや矢印キーで疑似カーソルを上下に移動して選択するものがあります。
下はメニュー画面の例です。
メニューはパラメータメンバと呼ばれる形式になっていますが、実運用時にはロードモジュール化することも多いです。もちろんパラメータメンバのままでも実行可能です。
メニューロードモジュール化は次のような利点があります。
- パラメータメンバで実行するよりも若干表示や処理が速い
- メニュー内容の書き換えができないので、セキュリティが向上する
欠点は以下です。
- メニューの書き換えができないので、メニューの更新に手間がかかる
- パラメータメンバを失くしてしまうと更新できなくなってしまう
頻繁にメニューの更新を行うような場合は、パラメータメンバを更新→ユーティリティを使ってロードモジュール化、という手間がかかります。
- 2 ジョブ起動ファイルの選定方法
-
RUNコマンドやJCLのRUN文でプログラムを起動するときにどのファイルに入っているプログラムを選んで起動しますか、という選択順序の決まり方です。
例えば、MYLMLというロードモジュールライブラリにPRG01という名前のロードモジュール、SYS@LMLにも同名のPRG01というロードモジュール、そしてSYS@PMLにもPRG01というパラメータメンバがあったときに、RUNコマンドで「PRG01;+エンターキー」とやったときにどのPRG01が実行されますか?という話です。 WindowsやLinuxでプログラムを実行するときにもカレントディレクトリを探して、パスが通っているところを順番に探しますが、そういった順番がA−VXも同じようにあります。 下の表はA−VXのジョブ起動ファイルの選定方法です。ジョブ起動ファイルの選定方法 DEV指定 FIL指定 動 作 ○ ○ 指定された装置の指定されたファイル内だけを探します。 ○ × 指定された装置の
SYS@LML→SYS@JSL→SYS@PML
の順に指定のジョブを探します。× ○ SRV 上の指定されたファイル内だけを探します。 × × RUNコマンドおよびスレッドの最初のJS またはPM の/RUN 文の場合、
SRV上の
SYS@LML→SYS@JSL→SYS@PML
の順に指定のジョブを探します。× × スレッドの途中でのJS またはPM の/RUN 文あるいはプログラム内の内部コール命令の場合、
当該スレッドのプライベートロードモジュールライブラリ
→SRV 上のSYS@LML→SYS@JSL→SYS@PML
の順に指定のジョブを探します。プライベートロードモジュールライブラリが保持されていなければ、SRV 上の
SYS@LML→SYS@JSL→SYS@PML
の順に指定のジョブを探します。
Windowsで「c:\program\abc.exe」とフルパス指定すると一番間違いなく目的のプログラムを実行できますが、A−VXのフルパス指定に対応するのが装置(DEV)とファイル(FIL)の両方を指定した場合です。
例えば「PRG01,DEV=MSD000,FIL=PROGRAM;」と書けば装置がMSD000でファイルがPROGRAMにあるPRG01という名前のジョブを実行することになります。
上から二番目は装置だけ指定した場合です。
例えば「PRG01,DEV=MSD000;」のように指定した場合です。MSD000はハードディスク装置の0番目なので、WindowsならCドライブに相当するものです。MSD001ならDドライブですかね。
ファイル名を指定していないので、その装置にあるSYS@LML内を探して、その中にあればSYS@LML内のジョブを起動します。無ければ次にSYS@JSLを探して有れば起動、無ければ次にSYS@PMLを探して有れば起動、無ければエラーメッセージを出して何も起動しません。
まずMSD000にあるSYS@LMLにPRG01というジョブ(ロードモジュール)があるか探します。もしPRG01があれば起動します。無ければ次にSYS@JSLにPRG01があるかどうか探します。しPRG01があれば起動します。無ければ次にSYS@PML内にPRG01があるかを探します。ここまで無ければ探すのを終了してエラーメッセージを出して処理を終了します。 SYS@LML、SYS@JSL、SYS@PMLの3つのファイル内しか探さないので、もしMSD000のPROGRAMという名前のファイルにPRG01が入っていても起動することはありません。 もしSYS@LMLとSYS@PMLにPRG01が入っている場合、「PRG01,DEV=MSD000;」と入力すると起動するのはどちらのPRG01か?この場合はSYS@LML内を先に探すので、SYS@LML内に入っているPRG01が起動されます。もしSYS@PMLの方のPRG01を起動したい場合は「PRG01,DEV=MSD000,FIL=SYS@PML;」と両方とも指定した方が間違いありません。
表の三番目は逆にファイル名だけ指定した場合です。
例えば「PRG01,FIL=SYS@PML;」と入力した場合はMSD000のSYS@PML内のPRG01を探して起動します。MSD001やMSD002にSYS@PMLがあっても探しません。
SRVとはMSD000のことだと思っていいです。ファイル名だけ指定した場合はMSD000の同名ファイルを探すということです。
「PRG01,FIL=PROGRAM;」ならMSD000にあるPROGRAMファイル内のPRG01を探して起動します。 表の四番目と五番目は装置名もファイル名も指定していない場合です。
例えば「#ABC;」と入力した場合です。 簡単に言うと最初はMSD000のSYS@LML→SYS@JSL→SYS@PMLの順番で起動するジョブを探す。 一旦ロードモジュールライブラリから何かを起動するとそれをプライベートロードモジュールライブラリとして設定する。以降同一スレッドで装置名/ファイル名無しでRUN文などを実行すると、まず最初にプライベートロードモジュールライブラリ内を探して、無ければMSD000のSYS@LML→SYS@JSL→SYS@PMLの順番で起動するジョブを探す。
(プライベートジョブストリームライブラリとかプライベートパラメータメンバライブラリとかは無いです。)プライベートロードモジュールライブラリの定義はNECのマニュアルから引用すると以下の通りです。
プライベートロードモジュールライブラリは、WindowsやLinuxのカレントディレクトリみたいなものに近いのかな。 スレッドのところで説明しましたが、メニューからジョブを起動する場合は、メニュー、タイトル自身がスレッドの途中であるため、装置名/ファイル名無しのときはプライベートロードモジュールライブラリから指定ジョブを探します。プライベートロードモジュールライブラリとはSRV上のSYS@LMLを除くすべてのロードモジュールライブラリを意味します。
〜中略〜
プライベートロードモジュールライブラリが選定されると、その装置とファイルが該当スレッド内で保持されます。そしてその値は該当スレッドで別のプライベートロードモジュールライブラリが使用されるまで有効となり、上表の4番目の指定方法では保持されているそのプライベートロードモジュールライブラリからサーチされます。
[システム管理説明書(2009年11月版)−2.4.2 ジョブ起動ファイルの選定方法]より
NECのマニュアルにも書いてありますがこれは忘れがちなので注意です。 それから「PRG01,DEV=MSD;」のように装置番号(装置名の3桁の数字部分)を省略することもできます。
以下の文はNECのマニュアルから引用ですが、自動サーチしますが、全部のファイルを探すということではないので注意が必要です。
いろいろと紛らわしいので、RUN文を書くときやメニューを作るときにはなるべく装置名とファイル名の両方を細かく指定した方がいいと思います。 過去に同じような話を別の切り口で書いた記事があるので下にリンクを置きます。 ライブラリからのジョブ起動装置としてMSD あるいはFDU が装置番号を省略した形式で指定されると、同種の装置上を自動サーチします。自動サーチでは、システム生成時の定義順に磁気ディスクまたはフロッピィディスク上をサーチし、最初に見つけたファイルだけ有効となります。それ以降の装置はサーチしません。例えば、上記表の2番目の指定方法でMSD と指定した場合で、最初の装置上でSYS@LML が見つかり、その中に目的のジョブが見つからなかった場合には、それ以降の装置のSYS@LML を探すことはせず、次は最初の装置からSYS@JSL を探します。
[システム管理説明書(2009年11月版)−2.4.2 ジョブ起動ファイルの選定方法]より - 3 1つの端末で複数ジョブの実行
-
1つの端末で複数のジョブを実行することができます。
スレッドのところで説明しましたが、画面切離コマンドを入力すると、新しくスレッドができて、そのスレッドが端末に接続されて、そこから新しいジョブを実行することができるようになります。 画面切離コマンドを何回も行えば、その数だけジョブを起動できます。 ただ通常はシステムでジョブの起動の上限値が決められているので、その数を超えて実行することはできないようになっています。
WindowsやLinuxはいくらでもたくさん制限なく同時に実行することができますが、起動するほどにメモリが足りなくなったり遅くなったりして最悪システムが動かなくなったりします。A−VXはそういうことが起きないように「ここまでは問題なく動きますよ」というところまでしか実行できないようになっています。 優先処理コマンドというものもあって、優先処理コマンドを入力しても新しいスレッドができて新しいジョブを実行することもできます。こちらは特殊なシステムコマンドで通常は使用しません。というのも「優先」だけあって他の同一端末上のジョブを全部一時停止させてしまうからです。 優先処理コマンドで実行するジョブは設計に特別な配慮が必要なので、優先処理コマンドで実行するためのジョブを用意する必要があり、優先処理コマンドはそのジョブだけしか実行してはいけません。 あらかじめ優先処理コマンド専用の伝票発行ジョブを作成しておいて、バッチ実行中に緊急で伝票発行が必要になったときにそのジョブを実行するとか、そのようなときに使うようです。 - 4 親ジョブから子ジョブの起動
-
ジョブから別のジョブを起動したりできます。そのときジョブ間に親子関係ができます。起動元のジョブが親ジョブ、起動先のジョブが子ジョブです。
ジョブストリーム(JS)から別のジョブストリーム(JS)やロードモジュール(LM)、パラメータメンバ(PM)を起動できます。同様にロードモジュールも別のジョブストリームやロードモジュール、パラメータメンバを起動できます。パラメータメンバはロードモジュールだけ起動できます。
メニューからジョブを起動したり、メニューから子メニューを起動したりも、メニューはパラメータメンバやロードモジュールなので同じく親子関係があります。 親ジョブから子ジョブを起動して、さらに子ジョブから孫ジョブを起動・・・と続けることもできます。 ただその親子の階層も制限があります。
JS からJSを起動する場合、3段階まで起動することができます。LMからLMを起動する場合は、何段階でも起動することができます。 通常はJSからLMを起動して、そこからまた別のLMやPMを起動、のように混在して起動する場合が多く、JSだけで親子関係、LMだけで親子関係になることは少ないと思います。混在すると複雑になるので実際は3段階ぐらいにしておくのが無難だと思います。 上でパラメータメンバはロードモジュールしか起動できないと書きました。するとパラメータメンバのメニューは、ロードモジュールだけしか起動できないの?という疑問があるかもしれませんが、メニューだけは特殊な処理をしているみたいで、ジョブストリームもパラメータメンバも起動できるようになっているようです。 - 5 ジョブの終了処理
-
ジョブが正常終了した場合は、ジョブが使用していたファイルをクローズしたりメモリ空間内のメモリを開放したりします。プログラム上でファイルをクローズし忘れていたりしても一応システムの方でクローズ処理をしてくれます。
ジョブが異常終了した場合も、ジョブが使用していたファイルをクローズしたりメモリ空間内のメモリを開放したりします。そのほかに異常終了の原因調査のためのアボートダンプを採るかどうかのメッセージが出て、採る選択をした場合はアボートダンプをファイルに書き込む処理が行われます。下の画面はジョブが異常終了したときの画面です。「ENTER ABORT DUMP PARAMETER」と出ています。これがアボートダンプを採るかどうかのメッセージです。
ここでアボートダンプを書き込むファイルの装置名、ファイル名を指定すればアボートダンプをファイルに書き込むことができます。装置名を指定せずエンターキーだけ押せば、アボートダンプの処理はせずにそのまま終了します。
事前準備もせずにアボードダンプだけ採っても何もわからないので、通常は採らずに終了させます。
異常終了したジョブがジョブストリームから起動したジョブの場合は、ステップ終了文まで読み飛ばして、次のジョブステップから処理が継続します。