IBM i 実行管理：5250サインオン表示～サインオンしてメインメニューまでの流れ

今回はIBM i にジョブ開始を要求した際の流れを説明します。分かりやすいと思われる5250端末ジョブからのサインオンを例にとってご説明します。
手元に環境がある方はそちらの設定も見ながら確認してみてください。

## ユーザーが5250セッションアイコンをクリックしてからメインメニューが表示されるまで

全体の流れは下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7d6c1934-84ff-e3d3-adb4-49c67c649a6a.png)


初見の方にはややこしく見えるのではと思います^^;
ですが一つずつ役割を見ていくと割とシンプルなので頑張ってみていきましょう。

## 1.ユーザーPCでの設定
ユーザーPCにACSやPCOMMなどエミュレーターS/Wを導入して、端末セッションの定義を行います。この例では下記を指定したとします。
    セッションタイプ　：　ディスプレイセッション
    ワークステーションID　：　GOMAD*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/119e4a97-325c-111d-b1a0-7bea91bf0504.png)
ACSはJavaベースなのでセッションタイプはディスプレイしかないのですが、PCOMM（やかつての(IAW:IBM i Access for Windows)ではプリンターセッションを選ぶこともできます。

※PCのエミュレーターセッションでディスプレイを指定するとIBM i では対応する装置記述 *DEVD はタイプTYPE *5555 となり、プリンターセッションの場合は TYPE *5553になります。現在ではデバイスは自動作成させる（システム値 QAUTOCFGで制御）事が一般的だと思うので意識されていないかもしれません。

PCで端末セッションを作成したらアイコンをクリックしてセッションを起動します。起動すると指定したIBM i に接続要求を行います。

### ※注意
ACSやIAWではこの後、サインオン画面を出す前にIBM i ユーザープロフィールのID/パスワードを入力が必要です。PCOMMなどでは必要ありません。このステップは今回は割愛しています。

## 2. IBM i 上で端末セッションを割り当て可能なサブシステムが検索され、5250サインオン画面が表示される。

IBM i でジョブを実行するにはいずれかのサブシステム SBS に割当てされなければいけません。サブシステムに端末セッションからの開始要求を割り当て可能とするには、サブシステム記述 SBSD のワークステーション名　または　ワークステーションタイプにPCエミュレーターセッションからの要求に合致した項目が含まれている必要があります。
ここでは、起動済みのサブシステムQSYS/QINTER のワークステーションタイプ項目に *5555 が指定されており、QINTERサブシステムがPCのエミュレーターセッションからのリクエストを受け取ります。

### ※サブシステム QINTERの設定を確認する

WRKSBSD QSYS/QINTER コマンドで設定を見てみましょう。WRKSBSDコマンドで画面の右上を見ると　状況：ACTIVE と表示されておりこのSBSD記述が活動中と分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a7a52dad-8b28-2cb7-1e29-b85b293a5706.png)

この画面で4 と 5 にPCのエミュレーターからの要求に合致する項目が含まれていればサブシステムはPCのエミュレーターセッションと通信を確立してサインオン画面を表示します。
今回の例では 5. ワークステーション・タイプ項目 に以下のように 5555 が含まれています。PCのエミュレーター定義はディスプレイ=5555になるのでこの値が合致します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/815417c4-ec1f-c4b4-3f46-80c201ee456b.png)

以上から、PCのエミュレーターセッションにはQINTERサブシステムがサイン・オン画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/18901f9b-c585-5f8d-e51d-8a1633cde191.png)

ところで、一つ前の画面で、タイプ 5555 の行に OPT 5を入れて詳細を表示しますと、下図のようにこの端末セッションではジョブ記述として *USRPRF ＝　サインオンするユーザープロフィールで指定したジョブ記述 JOBD を参照するよう指定されています。この指定はサインオンした後の挙動に影響します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/98373795-dfc9-a287-955e-a505d4ea45d3.png)



## 3.IBM i サインオン後の動作　その1：使用するジョブ記述の決定

さて、5250サインオン画面は出ましたが、この時点ではユーザーはログインしておらず、どのようなタイムスライスや実行優先順位、どのプールで処理を行うかなどはまだ決まっていません。

ここで GOMA というユーザーIDでログインしたとします。
先に見たようにQINTERサブシステムでタイプ 5555 でディスパッチされサインオンしたユーザージョブはジョブ記述としてサインオンしたユーザープロフィール指定のものを使用するようになっています。
サインオンしたユーザー（今回は GOMA ）の設定をWRKUSRPRFコマンドで確認してみます。
下図のように QGPL/QDFTJOBD が指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/77930ac9-96b8-622f-1aa9-214b934b7380.png)

## 4.IBM i サイン・オン後の動作　その2：ジョブ記述JOBDの設定から実行環境が決定される

ジョブ記述JOBD QGPL/QDFTJOBD を見てみましょう。WRKJODBコマンドです。表示された1ページ目のトップにユーザー・プロファイル *RQD とあります。
これは、対話型ジョブの場合には、開始されたジョブはサインオンで使用したユーザープロフィールで以降動作します、という指定になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/346fba0d-190e-940d-510e-4456fdfc7bfb.png)

さらに次ページキーを押すと次の画面になります。ここでは、経路指定データ　に注目してください。 QCMDI  となっています。この値がサブシステム内での実行環境を決める際に参照されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/43ea99ae-f57d-6528-f134-26dbcd0bd906.png)

## 5.サインオンしたジョブの経路指定データから初期プログラムが決定されるまで

ここでサブシステム　QINTER　の設定に戻ります。WRKSBSD QSYS/QINTER コマンド（DSPSBSD QSYS/QINTERでも可）を実行し、さらに　7.経路指定項目　を選択します。下記のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7cec8b6c-c5fc-8311-d0bd-5ae1d442a65f.png)

経路指定項目は順序番号の小さい方から　比較値　が検索されます。例では、サインオンしたユーザー GOMA は ジョブ記述 QDFTJOBDに指定された QCMDI という経路指定データを持っていますので、これと合致する行があるかを調べます。すると、順序番号 10 が比較値 'QCMDI' で合致することが分かります。

この結果、5250端末(タイプ5555)からサインオンしたユーザー GOMA はプログラム QSYS/QCMD が実行されます。

### ※補足説明
実は上記の説明は一点端折っています。正確にはサブシステム記述の経路指定項目の比較値　'QMCDI'の右横に開始桁　1 と記載があります。この意味は　ジョブ記述QDFTJOBDの経路指定の値を1桁目から確認して合致しているか確認します、という意味になります。
稀にですが開始桁が 2～　になっている場合もあります。その場合はジョブ記述の経路指定データの文字列の指定桁以降とサブ素システムの経路指定項目の比較値が合致していないといけないことになります。

サブシステム記述の経路指定の順序番号9999（一番最後に検索される）には 比較値 *ANY が通常指定されています。この指定によって合致する経路指定データが無い場合のジョブの動作が決定されます。

## 6. IBM i サインオン後の実行環境の決定

前の経路指定項目の検査でジョブがIBM i にサインオン後に最初に実行されるプログラムが QSYS/QCMD と決まりました。その際、同時に以下も決定されます。前の 経路指定項目の表示画面の順序番号10 で 5 詳細の表示 　を押すと下記の画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d4559675-61a8-6c2f-b3df-9cee6b0739cf.png)

プールIDに 2 が指定されている。この指定はこのジョブがどのプールで動作するかを指定しています。

### ※注意　ここでのプールID 2 とは？

ココが間違えやすいのですが、このプールID 2 とは WRKSYSSTSコマンドで見える 2 = ベースプールではない、という点です。
ここで表示されているプールIDは、このサブシステム（QSYS/QINTER)の 2. プール定義 で指定されたIDです。WRKSBSD(DSPSBSD)コマンドで 2. プール定義を確認します。すると、下記のようにプールID 2 ＝　*INTERACT であることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/00badc07-2f29-877f-6b87-b666d3fee91f.png)

同じプールは　WRKSYSSTSコマンドだと システムプール 3　と通常表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/86e7fbd8-81e1-3033-8722-946bf4baa0cb.png)

さらに、
経路指定項目にクラス *CLS として QGPL/QINTER が指定されている。

上記のクラスの指定を WRKCLS QGPL/QINTER で確認します。
実行優先順位が 20 、CPUのタイムスライス値が2,000ミリ秒 と分かります。また、PURGE(*YES)なことから対話型ジョブ型であることもわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/98c48797-4fa1-e88c-dae7-0454ae04e947.png)

## 7. 5250画面に初期プログラム（初期メニュー）が表示されるまで

いよいよ最終ステップです。ここまででジョブの実行環境（実行サブシステム、実行プール、優先順位、タイムスライスなど）が決定されました。

内部的にはQSYS/QCMD が呼び出さましたが、QCMDはさらに、指定されたユーザープロフィールの初期プログラムと初期メニューの指定を確認します。

例では GOMA ユーザープロフィールを確認すると、初期プログラム *NONE 、　初期メニュー MAIN *LIBL となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5aee85da-a385-3c43-02f5-14167ce1da98.png)

この結果、通常はメニュー QSYS/MAIN が呼び出され、5250画面に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/daad1314-2502-edcf-14c3-e4168f6e6169.png)

## ※ユーザー指定のメニュー画面を起動したい場合は？

ユーザープロフィールの初期メニューにユーザー作成のメニューを指定するか、初期プログラムにユーザー作成CLPを指定してCLPから初期画面を表示させることもできます。例えばユーザー作成の業務メニューを表示する＊CLP USRLIB/MENUCL01 を初期プログラムに指定する方法はとても多いと思います。

お疲れ様でした。

p.s

…なんでこんなに面倒なの…？と思いますよね？それがIBM i が様々なあらゆる環境で実行管理を緻密にできる理由なんです。バリエーションの説明は別で試みたいと思います。