【2008/09/28 original author TAKAO】
ここではJCLの細かい説明はしません。(なんせパラメータは莫大にあります。)むしろ読み物風に読んでいただいている間にJCLの概要を掴める事を目指しております(入門だもん)。
思い出
遠い昔、私が大学生のころは3270端末もなく、マジにパンチカードにソースコードを打ち込んでいました。このカードが80桁(バイト)でした。コンピュータ界には、いまだになんとなくテキストの幅は80バイトという雰囲気が漂っていますが、ここからきています。物理的なパンチカードですから、一文字間違えてもすべて打ち直しで、カードを膨大に無駄にしていくという地獄もあったのですが、ともかく、プログラムを書くところまではともかくとしましょう。
大学の計算センターでは所定のカードを自分が書いたパンチカードの上に重ねて置いて、最後はカードリーダの上に乗っけます。するとバタバタバタ、グォーッとお札勘定機のような勢いでコンピュータに読み込まれていきました。この「所定のカードを重ねなければいけない」意味がさっぱりわかりませんでした。今、考えれば、それはここで解説しようとするJCLだったのです。
JCLは Job Control Languageの略です。目的は大別してふたつあります。ひとつは、使うコンピュータ資源の割り振りです。もうひとつは、プログラムを自動実行させることです。ここでは、このふたつの目的にそって見ていきましょう。
資源の割り振り
かすかにはご存知でしょうが、昔はコンピュータで使う装置はとても高価なものでした。それゆえ、「誰がどれだけ使ったか」ということには課金もからみ、とても大事なことだったのです。今のように個人でサーバーでCPU、Disk, 回線を垂れ流しに使うなんて想像の外でした。
それゆえ、ディスクをどれだけ使うか、すでにあるデータだったらどれを使うのか、は重要な問題でした。もちろんプログラム自身がどれくらいのメモリーとCPUを使うかも重要でした。運悪くバグがあり、無限ループになど入ろうものなら巨額な課金となってしまいます。一定のCPU時間以上使ったら、そのプログラムは止めてしまったほうが、みんなが幸せだったのです。
プログラムの自動実行
今でも「バッチ」とか、運用系のエンジニアの人ならジョブ・スケジューリングという言葉はご存知でしょう。汎用機が作り出されたころも、ひとつのプログラムで全部のことをやろうとは考えていませんでした。例えば、なにかデータを作って、ソートして、また処理をする、という仕事を考えます。ソート・プログラムはご存知のように自分で雑なあてにならないコードを書くものではなく、汎用の実績あるプログラムにまかせるのは、当時から常識でした。この例でもおわかりいただけるかと思いますが、複数のプログラムを順々に動かすことの必要は昔からあったのです。
もっとも簡単なJCL
以下を見てください。
1 2 3 4 |
//JOBA JOB MSGCLASS=H //STEP1 EXEC PGM=PGMA //INPUT DD DSN=USER.DATA1,DISP=SHR //OUTPUT DD SYSOUT=* |
おそらくJCLを語る上ではこれ以上簡単なJCLはないかと思います。 説明の都合上、番号をつけます。本来、JCLは左端は//でなければなりません。
1 2 3 4 |
1 //JOBA JOB MSGCLASS=H 2 //STEP1 EXEC PGM=PGMA 3 //INPUT DD DSN=USER.DATA1,DISP=SHR 4 //OUTPUT DD SYSOUT=* |
この中でキーワードは、JOB,EXEC,DDの三種類です。
1のカード(冒頭でお話しししたとおり、昔は一行が一枚のカードだったのです!)は、JOBカードと呼ばれます。JOBAはこのJOBの名称です。
2のカードは、EXEC(エグゼック)カードと呼ばれ、ひとつのプログラムごとに存在します。ひとつのプログラムの処理を「ジョブステップ」といいます。ジョブは複数のジョブステップで作ることが可能です。そう、これが自動実行できる秘密です。
3のカードは、DD(ディーディー:Data Definition)カードと呼ばれ、使うコンピュータ資源を指定します。ここでは、DSNと書かれていますからデータセット(ファイルとだいたい同じです)を使うことが分かります。
4のカードは、同じようにDDカードですから使うコンピュータ資源を指定しているのですが、SYSOUTとあるので特殊な資源を使うことが分かります。
はい、これで基本中の基本は終わりです。 要約すると、JCLはジョブという単位ごとに作ります。ジョブの中はジョブステップが1つ以上、いくつかあります。ジョブステップごとにDDカードでどういう資源を使うかを定義します。
次に個別のカードの存在意義を、考察します。
JOBカード
このカードのパラメータの話をする前にジョブクラスという概念について説明します。JCLでジョブが実行されますが、このジョブとか、ジョブクラスという概念は実はMVS(z/OSだろうがMVSでとおします)はもっていません。すべて、ジョブエントリーサブシステム(現在だと99%のお客ではJES2)の作り出した概念です。JES2は、ジョブという概念を処理するために、あらかじめMVS上にジョブをさばくアドレス空間をいくつも用意します。なにもプログラムがないとアドレス空間は存在できないので、イニシエーターというジョブを引き込む内通者のようなプログラムをスタンバイさせておきます。このイニシエーターが、ジョブクラスという概念を実現します。
またまた昔話しで恐縮ですが、今、業務で課金の計算、経理、経営企画と3つの部がひとつの汎用機で仕事をしていたとします。課金は月の中旬に忙しくなり、経理は月末、経営企画は四半期の初めに忙しくなるとします。そうするとジョブのクラスを課金=A、経理=B、経営企画=Cと作っておきます。月の初めに経営企画がたくさんジョブを流したいのなら、Cのクラスのアドレス空間(イニシエータ)を多めに用意します。月の中旬になるとCのクラスの数を減らし、課金のクラスAを増やします。下旬になるとクラスBを増やします。
ジョブがどんどん投入されていても、こうやってジョブクラスという概念を利用して、いくつ走らせるかをコントロールすることができるのです。 現在では、ジョブクラスというのはそういう仕事の種類よりも、ジョブの特性、バッチ、オンライン、TSOなどで分類することが普通になってきました。
いずれにしてもJOBカードはジョブクラス、そのジョブで使った資源の集計(課金のため)、どれくらいコンピュータ資源を使わせていいのか、といったコントロール情報を定義するカードです。
EXECカード
このカードは主にプログラムについてのコントロールを記述します。プログラムもモジュール名をPGM=の後に書きますが、この後に//STEPLIBカードなんてもので、そのモジュールがどのライブラリーにあるか、を教えることもできます。ちなみにルーズな書き方も可能で、
1 2 3 |
//STEPLIB DD DSN=xxxxxx,DISP=SHR // DD DSN=yyyyyy,DISP=SHR // DD DSN=zzzzzz,DISP=SHR |
などと「どれかにあるわい」という書き方も可能です。ちなみにこのように、DDカードのラベルが一個なのに、空欄のDDカードを並べる技を「コンカチ(concatination)する」といいます。できる場合とできない場合があるので注意してください。
EXECカードは他に、「このステップが失敗したら、残りのステップをどーする」というコントロールが可能な、COND=パラメータを記述できます。なにもかかなければ、順々に有無を問わず実行を続けます。これこそが、JCLでの自動実行を支えているメカニズムといっても過言ではありません。EXECカードはプログラムの指定と、COND=でプログラムが終わった後の処置を記述できます。
DDカード
このカードはコンピュータリソースの割当を行うカードです。実はデータセットだけではなく、通信制御装置なども指定できます。UNIT=というパラメータがありますが、この後に書けるものはSYSDAのような装置グループ名のみならず、特定の装置のアドレス(例えば、140とか)を書くことができます。さらに、DISK,TAPEはDSN=で特別扱いでデータセット名を指定できます。データセット名という概念をもった装置は必ずボリューム名を必要とします。明示的に書く時には、VOL=SER=の後に書きます。つまり、きちんと優等生的に書くならば、
1 |
//INPUT DD DSN=hogehoge,DISP=SHR,UNIT=SYSDA,VOL=SER=VOL001 |
みたいな感じです。
しかし、こういうJCLの定義を覆す存在があります。それが、カタログです。MVSが誕生したころには、カタログなんていうシャレたものはありませんでした。すべてのデバイスタイプとボリューム名とデータセット名は人間様が表で管理していました。それは機械にできそうなものでしたから、その場所情報をデータベースとしてOSが持つようになりました。かくして、人間様は最低限必要な、装置のタイプとデータセット名のみを指定すればよくなったのです。そして役に立つヤツが権力をふるい始めるとゴーマンになるのは、カタログとて同じで、手で書いた指定を無視して判断するオプション(SMS)というものすらできたのです。
もうひとつ、JCLのあり方をわかりにくくしているヤツがいます。それはJOBカードのところで説明したJCLを操っているJES2です。しばしば、こういうJCLを見たことはありませんか?
1 2 3 4 5 |
//INPUT DD * hogehogehogehoge ahhfunaffunaffunaffun korakorakorakora /* |
ここで一行目のDD以下の’*’は今時の言葉でいう「以降/*までヒアドキュメントだよ」といっております。つまり、INPUTの中身そのものだよ、といっているのです。JES2がヒアドキュメントをファイルとしてMVSに渡してくれます。仕事の度にかわるパラメータなんかに使うと便利です。
似たようなわかりにくいDDに次のようなものがあります。
1 |
//OUTPUT DD SYSOUT=* |
このSYSOUTというヤツは、JES2のもつ特別なファイル、スプールに書き出しちゃうよ、ということを指定しています。スプールは印刷か、ネットワークで出力を飛ばすためにありますから、次に読み込むということは許されません。SYSOUTはアウトプット専門だと思ってください。
あ、もう、JCLの入門コースが終わってしまった。足りないところは、掲示板かコメントかメールかなんでもいいので、メッセージください。答えられるように努力してみまする。
オープン系の人から見て慣れるべき点は、//で始まることと、使う資源を事前に宣言すること、JES2がSYSIN,SYSOUTなどの妙なサービスをしてくれること、くらいではないでしょうか。
面倒くさいでしょうが、メインフレームのこういうやり方には、いまだにオープン系よりも優れている点もあるのです。それはすべてのことが簡単に記録可能なのです。例えば、コマンドを入力してジョブを開始するとします。そのコマンドはOS上、特に工夫しない限り残らないはずです。しかし、コマンド中の-オプションが間違って実行されたかも知れません。後になったらわかりません。メインフレームではJCLは保管可能です。どのジョブをどういうパラメータで実行したのか、手順を決めれば当然のように保管しておくことができるのです。ここが、オープン系とメインフレーム系の発想の大きな違いであると、私は思ってます。
【2008/09/28 original author TAKAO】