【z/OS】STCとは？サービス起動の仕組みから定義までを理解する

## 1. はじめに：z/OSを裏で支える、STCとは何か

z/OSでアクティブなタスクを見ると、JES2, SDSF, TCPIP, DB2MSTR, CICSといった名前が並んでいます。これらは一体何者で、誰が動かしているのでしょうか。

これらのタスクが、z/OSのシステムサービスを支える **STC（Started Task）** です。STCとは「システムが動き続ける限り、バックグラウンドで特定の仕事をし続ける、専門のプログラム」のことで、Windowsにおける「サービス」やLinuxの「デーモン」に相当します。

この記事では、STCの役割から、`START`コマンドで起動する内部の仕組み、そして必要な定義までを体系的に解説します。読み終える頃には、日々の運用で目にするタスクたちの正体を深く理解できるようになっているはずです。


## 2. STCの役割と、システム内での位置づけ

STCの役割を深く知るため、その本質的な特徴と、システム全体における立ち位置を見ていきましょう。

### STCが持つ3つの重要な特徴

*   **①常駐性 (Persistence)**
    一度起動されると、オペレーターが明示的に停止するまで動き続けます。常にリクエストを待ち受けるデータベースなどのサービスに不可欠な性質です。

*   **②サービス提供 (Service Provision)**
    DB2のデータアクセスやTCP/IPのネットワーク通信のように、他のプログラムやシステム全体に対して継続的な機能（サービス）を提供することが主な目的です。

*   **③独立したアドレス空間 (Isolated Address Space)**
    各STCは専用のメモリ領域で動作します。これにより、あるSTCに問題が起きても他へ影響が広がりにくく、z/OSの高い信頼性を支える重要な要素となっています。

### z/OSタスクの比較とSTCの位置づけ

STCの役割は、z/OSの他のタスク実行形態と比較するとより明確になります。

 
![z/OSの3つのタスク実行形態の比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030603/f4c7bce1-559b-4595-a187-fbaba6873f4d.png)

**【図の解説】**
この図が示すように、z/OSのタスクは目的別に使い分けられます。**TSOユーザー**が対話的な作業、**バッチジョブ**が非対話的な大量処理を担うのに対し、**STC**はそれら全ての活動の基盤となるサービスを提供します。

TSOやバッチジョブは、実はDB2のようなSTCを「利用する側」にいます。つまりSTCは、特定のユーザーや処理に依存せず、システムそのものの一部として機能する存在です。


## 3. `S メンバー名` コマンドの裏側で起きていること

コンソールから実行する `S DSN1MSTR` といったSTCを起動するためのコマンドですが、一行のコマンドの裏側では、z/OSの複数の主要コンポーネントが一連の流れに沿って連携しています。

その起動プロセスを、ステップバイステップで見ていきましょう。

 ![STC起動の内部フローを示した図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4030603/0469abaf-10bb-425f-9ec2-27c620870284.png)

**【図の解説】**

上の図は、オペレーターがコマンドを実行してから、実際にSTCが起動するまでの一連の流れを視覚化したものです。各コンポーネントがどのように連携しているか、番号順に見ていきましょう。

**登場する主なコンポーネント**
*   **JES2/3:** システム全体のジョブやSTCを管理する司令塔です。
*   **PROCLIB:** STCの「設計図」であるJCLが保管されている場所です。
*   **RACF:** システムのセキュリティを守る「門番」の役割を担います。
*   **イニシエーター:** 新しいタスクを実行するための「作業場」を準備する係です。

**処理の流れ**

1.  **起動命令:** オペレーターがコンソールから `S DSN1MSTR` を実行します。この命令は、システムの中核であるJESに渡されます。
2.  **設計図の捜索:** JESは、プロシージャー・ライブラリー（PROCLIB）の中から `DSN1MSTR` という名前のJCLメンバーを探し、実行すべき内容を確認します。
3.  **権限の確認とユーザーIDの特定:** JESは、セキュリティ製品であるRACFに「このSTCを起動する権限を持つのはどのユーザーか？」を問い合わせます。RACFは定義を元に、STCに割り当てるべきユーザーID（例：DB2USER）をJESに伝えます。
4.  **作業場の準備:** JESはイニシエーターに対し、特定のユーザーIDの権限で新しいタスクを開始するよう指示します。
5.  **アドレス空間の生成:** イニシエーターは、STCが他のプログラムから独立して動作するための専用メモリ空間（アドレス空間）を生成します。
6.  **プログラムの実行:** 確保されたアドレス空間内で、JCLに記述されたプログラム（`PGM=DSN1MSTR`）が、割り当てられたユーザーIDの権限で実行を開始します。
7.  **サービス開始:** これでSTCは正常に起動し、サービスとしての活動を開始します。

**まとめ**
このように、`START`コマンド１つの裏には、JESを中心とした各コンポーネントの連携が存在します。STCは単にプログラムが動くだけでなく、権限管理と保護されたメモリ空間の下で、z/OSによって制御されたタスクとして起動されます。


## 4. STCを動かすために必要な「3つの定義」

STCは、`START`コマンド１つだけで起動するわけではありません。STCを正しく、そして安全に動作させるためには、最低でも以下の3つの要素が定義されている必要があります。それは「設計図」「実体」「許可証」に例えることができます。

### ①設計図：PROCLIBメンバー（JCLプロシージャー）

STCを起動する際の「手順書」や「設計図」にあたるのが、**PROCLIB**に格納されたJCLプロシージャーです。オペレーターが `S MYSTC` とコマンドを実行すると、JESはこのPROCLIBから`MYSTC`という名前のメンバーを探し出し、その内容に従ってタスクを起動します。

このJCLには、STCの振る舞いを決定づける重要な情報が記述されています。

*   `EXEC PGM=...` : どのプログラムを起動するか（STCの「実体」を指定）。
*   `STEPLIB DD ...` : そのプログラムが標準ライブラリにない場合、どこに格納されているかを指定。
*   各種`DD`ステートメント : STCが使用する設定ファイル、ログ出力先、作業用データセットなどを定義。

例えば、ある架空のWebサーバーSTCのJCLは以下のようになります。

```jcl
//MYWEBSRV PROC
//*
//STEP1    EXEC PGM=MYWEBAP,REGION=0M,TIME=NOLIMIT
//*
//STEPLIB  DD DSN=MYAPP.V1R0.LOADLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSDUMP  DD SYSOUT=*
//CONFIG   DD DSN=MYAPP.V1R0.CONF(PROD),DISP=SHR
//LOGDATA  DD DSN=MYAPP.V1R0.LOGS,DISP=OLD
```

このJCLは、「`MYAPP.V1R0.LOADLIB`にある`MYWEBAP`というプログラムを、`MYAPP.V1R0.CONF(PROD)`を設定ファイルとして起動せよ」という、極めて具体的な指示書なのです。

### ②実体：実行プログラム（ロードモジュール）

JCLが設計図なら、`PGM=`で指定されたプログラムは、STCの魂とも言える「実体」です。これは、COBOLやC言語などで書かれたソースコードがコンパイル、リンクエディットという工程を経て作成された、z/OSが直接実行できる形式のファイル（ロードモジュール）です。

これらのプログラムは、`SYS1.LINKLIB`のようなシステム共通のライブラリか、あるいは前述の`STEPLIB` DDステートメントで指定された専用のライブラリに格納されています。

多くのSTCは、データベースやシステム設定など、重要なリソースにアクセスする必要があります。そのため、実行プログラムには**APF（Authorized Program Facility）許可**という特別な信頼性の証が付与されることがよくあります。これにより、プログラムは通常よりも高い権限で動作し、OSの深層部の機能を呼び出すことが可能になります。この強力な権限のため、APF許可ライブラリの管理はセキュリティ上、非常に厳格に行われます。

### ③許可証：セキュリティ定義（RACF）

STCを動かす上で、最も重要なのが「誰として動くのか」という権限の定義です。STCは独立したタスクとして、特定のユーザーIDに紐付いて動作します。この「許可証」を発行するのが、RACFなどのセキュリティ製品です。

重要な理由は、STCに必要以上の権限を与えないためです。例えば、WebサーバーのSTCには、Webコンテンツのデータセットを読む権限だけを与え、人事データベースへのアクセス権は与えない、といった厳格な管理が可能になります。

この定義には、一般的にRACFの`STARTED`クラスが用いられます。

```racf
/* MYWEBSRVというSTCに、ユーザーID WEBUSER を割り当てる定義 */
RDEFINE STARTED MYWEBSRV.* STDATA(USER(WEBUSER) GROUP(WEBGRP))

/* 定義を有効化する */
SETROPTS RACLIST(STARTED) REFRESH
```

この定義を投入することで、オペレーターが `S MYWEBSRV` コマンドを実行すると、z/OSは自動的にこのSTCを`WEBUSER`というユーザーの権限で起動します。これにより、STCの行動はすべて`WEBUSER`の権限の範囲内に制限され、システムの安全性が保たれます。

「設計図」「実体」「許可証」の3つが揃って初めて、STCは意図通りに、そして安全にその役割を果たすことができます。



## 5. まとめ

この記事では、z/OSの安定稼働を支える、**STC（Started Task）** について掘り下げてきました。

STCは、独立したメモリ空間で保護され、権限管理の下で動作する、z/OSのサービス提供の基盤です。`START`コマンドの裏には、JESを中心としたコンポーネントが連携し、「設計図(PROCLIB)」「実体(プログラム)」「許可証(RACF)」という3つの定義に基づいてタスクを起動する、仕組みが存在します。


しかし、z/OSのSTCはこれだけでは終わりません。SSHDやz/OSMFといった最近のSTCのJCLを覗くと、`PGM=BPXBATCH`という記述や `/var/zosmf `というディレクトリツリーの記述が登場します。これは、STCがz/OSのもう一つの顔である **USS（UNIX System Services）** と連携して動いている証です。

次回の記事では、このUSSとは一体何なのか、そしてSTCがどのようにUSSの世界と結びつき、現代的なサービスを提供しているのか、そのハイブリッドな仕組みを解説しいきます。


<br>

▼ 次回記事

https://qiita.com/uga_zosmf/items/53a32447054dccd66b4f




### 参考文献


https://www.ibm.com/docs/ja/zos/2.3.0?topic=reference-started-tasks

https://techdocs.broadcom.com/us/en/ca-mainframe-software/security/ca-top-secret-for-z-os/16-0/administrating/maintaining-special-security-records/maintain-the-started-task-command-stc-record.html


https://www.ibm.com/docs/en/zos/2.1.0?topic=operations-controlling-started-tasks

https://www.ibm.com/docs/ja/zos/2.3.0?topic=SSLTBW_2.3.0/com.ibm.zos.v2r3.ieab600/toc.html

https://www.ibm.com/docs/ja/zos/2.3.0?topic=SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag100/toc.html

https://www.ibm.com/docs/ja/zos/2.3.0?topic=SSLTBW_2.3.0/com.ibm.zos.v2r3.icha700/toc.html

https://www.ibm.com/docs/ja/zos/2.3.0?topic=SSLTBW_2.3.0/com.ibm.zos.v2r3.ieae200/toc.html