当シリーズを始めた経緯や、検証環境の情報についてはこちらのindexページをご覧ください。
PROGxxとは
プログラム管理に関する設定を定義し、APFライブラリー、システム・ライブラリー(LNKLST/LPALST)、出口ルーチンなどを動的に管理・制御するメンバー
-
APFライブラリーとは:
z/OSにおいて「システム保護の制限を回避できる特別な権限」を持つプログラム(実行モジュール)を格納するための専用ライブラリー通常、ユーザープログラムはシステムの安定性を保つために、メモリの重要な領域への書き込みや特定のシステム命令の実行が制限されています。しかし、OSの機能拡張やセキュリティソフト、データベースといった重要なプログラムは、これらの制限を超えて動作する必要があります。APFライブラリに登録されたプログラムは、「APF許可(Authorized)」状態となり、システムの中枢にアクセスできるようになります。
-
LNKLSTとは:
システムがプログラムを検索・ロードするためのライブラリー群(LNKLST連結)。プログラムが実行される際、その都度ディスクから各ユーザーのアドレス空間へロードされる。
-
LPALSTとは:
IPL時にページング可能なLPA(PLPA)を構築するためのライブラリー群(LPALST連結)。IPL時、リストされたライブラリからモジュールが共通ストレージ(PLPA)へ一括ロードされる。
-
EXIT ROUTINE(出口ルーチン)とは:
システム内の特定のイベントに対して、独自の処理プログラムを割り当てるための設定。
想定される注意点/考慮点
IEAAPFxxやLNKLSTxxではなく、PROGxx内の各ステートメントを使用して定義する方法が推奨されている
従来、APFライブラリーやシステム・ライブラリーなどの設定変更を反映するためには、対応するPARMLIBメンバーを編集しIPLを実行する必要がありました。PROGxxで複数のメンバーを集約管理することができ、かつSETPROGコマンドによりIPLなしでシステム定義を即時変更・反映できるため、PROGxxを使用することが推奨されています。
また、2025年7月22日付けのz/OS 3.2発表レターで、z/OS 3.2をもってIEAAPFxxとLNKLSTxxはサポート終了を迎える予定だと発表されました。(意向に関する全ての発表は、今後予告なく変更・取り消される場合があります)
IBM z/OS 3.2 unlocks the value of IBM z17
実機検証
各パラメーターの詳細についてはリンク先のマニュアルをご参照ください。
静的変更(IPL)
-
APFステートメント:
APF 許可ライブラリー・リストの定義・管理
APF FORMAT(DYNAMIC)で、定義の動的変更を可能にする運用状態 (DYNAMIC) にすることを設定し、APF ADD DSNAME() VOLUME()でAPFリストにデータセットを追加します。

「MVS Initialization and Tuning Reference」PROGxx APF ステートメントの構文フォーマット
システムは、IPL時にSYS1.LINKLIBとSYS1.SVCLIBを自動的にAPFリストに追加します。 また、LPAにロードされるモジュールはシステムによって自動的にAPF許可されているとみなされます。
-
LNKLSTステートメント:
システムのプログラム検索パスであるLNKLSTを定義・管理
LNKLST DEFINE NAME()でLNKLSTを定義し、LNKLST ADD NAME() DSN()でそのLNKLSTに追加するデータセットを指定します。

「MVS Initialization and Tuning Reference」PROGxx LNKLST ステートメントの構文フォーマット
-
EXITステートメント:
z/OSのシステム出口(System Exits)を動的に管理
EXIT ADD EXITNAME() MODNAME()で、特定の出口ポイント(システム内で特定のイベントが発生した際に呼ばれる場所)に対して、実行するモジュールを紐付けます。
例:SMFのジョブ開始出口(SYS.IEFU83)に、IEFU83というプログラムを割り当てる

「MVS Initialization and Tuning Reference」PROGxx EXIT ステートメントの構文フォーマット
IEFU83:SMFレコードが書き込まれる直前に制御を受け取るインストール出口ルーチン。IBMが提供する標準的な処理の途中に、ユーザー独自の処理を割り込ませるための仕組みを提供する。
例:IEFU83の標準的な処理は特定のSMFレコードをデータセットへ書き込むか、破棄するかを決定するものだが、導入先独自の処理を入れることで、特定の条件(ピーク時間帯の動作など)に合致する場合にのみ記録を残すといった制御が可能。
「MVS Installation Exits」IEFU83 — SMF レコード出口
IPL時に参照されるIEASYSxxに、使用するPROGxxのサフィックスを指定します。

IPL時に IEE252I:MEMBER xxxx FOUND IN ... のメッセージが表示されます。

IEE252I:
メンバー member がメッセージ・テキストの parmlib データ・セット parmdsname で検出されたときに、ハードコピー・ログでのみ出される通知メッセージです。
「MVSシステム・コード」IEEメッセージ IEE252I
Displayコマンドでの確認
-
D PROG,APFで、APF許可ライブラリーの情報を確認することができます。

「MVS System Commands」 Displayコマンド APF 許可ライブラリーのリスト内の項目の表示 (PROG、APF)
-
D PROG,LNKLSTで、現在システムで使用されているLNKLSTセット名、そのLNKLST内の情報を表示することができます。

D PROG,LNKLST,NAMESで、システムに定義されているLNKLSTを一覧表示します。

「MVS System Commands」 Displayコマンド LNKLST 情報の表示 (PROG、LNKLST)
-
D PROG,LPA,MODNAME=modnameで、LPA内にあるモジュールのエントリー・ポイント、ロード開始アドレス、サイズなどを表示することができます。

「MVS System Commands」 Displayコマンド LPA 情報の表示 (PROG、LPA)
-
D PROG,EXITで、すべてのシステム出口を一覧表示することができます。

D PROG,EXIT,EXITNAME=で、特定のシステム出口の状態を確認することができます。

D PROG,EXIT,MODNAME=で、特定のロードモジュールがどのシステム出口に関連付けられているかを確認することができます。

「MVS System Commands」 Displayコマンド 動的出口の表示 (PROG、EXIT)
上記のコマンドで確認した情報は、SDSFのパネル(DYNX、LNK、LPA、APF)で確認できて便利です。
動的変更
-
SETPROG APF,ADD,DSNAME=ライブラリ名,VOL=VOLSERで、APFリストにライブラリを追加することができます。

「MVS System Commands」 SETPROGコマンド APF リストの更新
-
SETPROG LNKLST,ADD,NAME=LNKLST名,DSNAME=ライブラリー名で、データセットを指定したLNKLSTに追加することができます。
現在使用されているLNKLSTを確認し、OTANI.LINKLIBを追加してみます。

SETPROG LNKLST,ADD,NAME=LNKLST00,DSNAME=OTANI.LINKLIB

CSV510I LNKLST SET lnklstset WAS NOT CHANGED. IT IS IN USE表示されました。CSV510I:
使用中の LNKLST セットに対して追加または削除することはできません。 LNKLST セットが特定のジョブまたはアドレス・スペースに関連付けられているとき、あるいは LLA がその LNKLST セットを使用して LNKLST を監視しているときは、LNKLST セットは使用中です。
「MVS System Messages,Vol4 (CBD-DMO)」CSVメッセージ CSV510I
現在使用中のLNKLSTに対して、データセットを追加・削除することはできないようです。そのため、別のLNKLSTを定義→新LNKLSTにモジュールを追加→新LNKLSTを動的に反映させるという手順が必要です。
SETPROG LNKLST DEFINE NAME(LNKLST01) COPYFROM(CURRENT)で、現在アクティブなLNKLSTの内容を引き継いで新LNKLSTを作成します。COPYFROM()でLNKLST名を明示的に指定することもできます。

SETPROG LNKLST,ADD,NAME=LNKLST01,DSNAME=OTANI.LINKLIBで、データセットを追加します。

SETPROG LNKLST,ACTIVATE,NAME=LNKLNST01で、指定したLNKLSTに切り替えます。

LNKLST01がアクティブになりました。

再度D PROG,LNKLSTを実行します。

LNKLST01の中にOTANI.LINKLIBが追加されていることを確認できました。

ATTOPパラメーターを指定すると、* LNKLSTの先頭に自動的に追加されるデータセットの次に指定したデータセットを連結します。省略時はATBOTTOMパラメーターが指定され、SETPROGコマンドで追加したデータセットはLNKLSTの最後に連結されます。
*:SYS1.LINKLIB、SYS1.MIGLIB、SYS1.CSSLIB、SYS1.SIEALNKE、SYS1.SIEAMIGE
SETPROG LNKLST,ADD,NAME=LNKLST01,DSNAME=OTANI.LINKLIB,ATTOP

D PROG,LNKLST

「MVS System Commands」 SETPROGコマンド LNKLST 連結の更新
ライブラリー内のモジュールを更新した後は、F LLA,REFRESH コマンドでライブラリのディレクトリ情報を最新状態に更新する必要がある
LLAとは、プログラムのロードを高速化し、システム全体のパフォーマンスを向上させるための管理機能です。通常は、ディスク上のデータセットから「どこにモジュールがあるか」という目次情報を探しに行きますが、メモリ上にその目次情報を置くことで、頻繁に使われるモジュールを効率的に実行することができます。LLAはメモリ上の目次情報を参照するので、LNKLSTに含まれている既存のデータセットの中にあるプログラムをリンク・エディットなどで上書き更新した場合は、F LLA,REFRESHを実行する必要があります。

CSV210I {LNKLST | LIBRARY} LOOKASIDE:
「MVS System Messages Volume 4 (CBD-DMO)」CSV メッセージ CSV210I今回は
SETPROG LNKLST,ACTIVATEで新LNKLSTをアクティブにしました。その時点で新LNKLSTの情報を元にディレクトリ情報が更新されたので、F LLA,REFRESHコマンドの実行は必要ありませんでした。
-
SETPROG LPA,ADDで、指定したモジュールを追加します。
今回は動的に追加する練習として、IEFBR14(何もしないプログラム)をテスト用のライブラリーにコピーしてSETPROGコマンドを実行してみました。

SETPROG LPA,ADD,MODNAME(MYTEST01),DSN=OTANI.TESTLIB
MYTEST01が動的に追加されたことを確認できました。

モジュールを削除してみます。
SETPROG LPA,DELETE,MODNAME(MYTEST01),DSN=OTANI.TESTLIBを実行するとエラーになりました。

モジュールを動的に削除するにはFORCE(YES)パラメーターを指定する必要があり、SETPROG LPA,DELETE,MODNAME(MYTEST01),FORCE(YES)で、追加したモジュールを削除することができました。出口ルーチンを削除するときは、指定したルーチンを実行中の出口がないことを確認する必要があります。

「MVS System Commands」 SETPROGコマンド 動的 LPA の内容の管理
-
SETPROG EXIT,ADDで、作成したシステム出口と出口ルーチンを動的に紐づけます。
システムに存在しないシステム出口に対してIEFBR14を紐づけてみたところ、そのコマンドで指定されたEXITNAMEでシステム出口を自動的に作成してくれました。
SETPROG EXIT,ADD,EXITNAME=OTANI.DUMMY.EXIT,MODNAME=IEFBR14


マニュアルを調べると、システム出口を定義する前に出口ルーチンを紐づけると、そのシステム出口は暗示的に定義されるとありました。
「MVS Programming: Authorized Assembler Services Reference, Volume 1 (ALESERV-DYNALLOC)」 CSVDYNEX Define an exit
SETPROG EXIT,DELETE,EXITNAME=OTANI.DUMMY.EXIT,MOD=IEFBR14
システム出口と出口ルーチンの紐づけを解除できました。

このDELETEパラメーターはシステム出口に紐づく出口ルーチンを削除する指定なので、通常はSETPROG EXIT,DELETEを実行してもシステム出口自体は残るはずです。

しかしD PROG,EXIT,EXITNAME=OTANI.DUMMY.EXITを実行したところ、CSV463I NO EXIT MATCHING OTANI.DUMMY.EXIT EXISTSというメッセージが表示されさました。
CSV463I NO EXIT MATCHING exitname EXISTS
DISPLAY PROG,EXIT コマンドが、特定の出口 (または、総称文字 * で終わる出口名の 指定による出口グループ) の表示を要求しました。 そのような出口または出口グループが現在定義されていません。
「MVS System Messages Volume 4 (CBD-DMO)」CSV メッセージ CSV463I存在しないシステム出口に出口ルーチンを紐づけ、
SETPROG EXIT,DELETEで紐づけを解除すると、システム出口自体も定義が削除されるようです。
終わりに
ここまでお読みいただきありがとうございました。
他のPARMLIBメンバーについてもぜひご覧ください。
PARMLIBメンバー記事indexページはこちら