《大型机学习之具体技术之-z/OS中的作业管理系统,SDSF工具及JCL》
Z/OS中的作业管理概览
Z/OS 操作系统通过 JES 子系统对系统中绝大多数的作业进行控制和管理,包括从系统外部接收作业、对系统中的作业进行调度、管理作业的输出等。现在,在定制z/OS 系统时客户可以选择使用两个不同的JES 子系统:JES2 和JES3。
JES2 是HASP(Houston automatic spooling priority)的继承和发展。HASP 是早期使用的一个程序,它能够提供调度、作业流程控制、数据管理和作业管理等功能。作为历史的遗迹,至今仍然在 JES2 中可以发现HASP 的影子,如许多模块名的前缀、所有从JES2 发给操作员的消息的前缀都是HASP。实际上JES2 仅仅是HASP 在功能上的一个扩展,从这个意义上说,JES2 可以看成是 z/OS 的一个组成部件,是用来在z/OS 中更高效地实现脱机打印、作业调度和管理等功能的。那么为什么要将z/OS 和作业控制子系统分开呢?
简单地说,为了使系统的效率更高,系统中的每一个作业都被分成了多个任务进行处理,在任意时间点上,系统资源忙于处理来自于不同作业的任务,还有许多任务在等待被处理。
JES 子系统和z/OS 的基础控制程序(BCP)分别管理作业和系统资源,JES2 管理运行前和运行后的作业;基础控制程序管理运行中的任务。下图简单地表示了两者之间的关系:
在z/OS 系统中,我们将一个作业的生命期分为六个阶段:
输入(Input)
转换(Conversion)
运行(Processing)
输出(Output)
打印(Print/Punch)
清除(Purge)
(如果操作员的每一个动作都要被归结为一个作业的话,那岂不是相当的麻烦,不过好在用户只负责输入这一步,可即使如此,也让我从此跟双击运行的好日子划上了句号。)
除了第三步由 z/OS 的基础控制程序管理外,其余阶段全部由 JES2 进行管理。对这些阶段的我们将会在后面的章节中进行详细介绍。
我们可以选择使用JES3 作为作业控制子系统,那么这两者之间的区别在哪里呢?如果
在仅有一个处理器的系统配置情况下,JES2 和JES3 所完成的工作基本类似,也就是将作业
读入系统、转换为系统可识别的格式、调度作业的运行、处理作业的输出、最终将作业从系
统中清除。但如果在包含多个处理器的系统配置情况下(我觉得这句话真废,哪个大机系统不是装了一大堆处理器的,)JES2 和JES3 便有了明显的不同。
JES2 的功能
下面主要介绍 JES2 在系统中所完成的主要功能,包括对系统中大部分作业处理的六个 阶段进行管理,以及JES2 的主要功能。
一.作业处理的六个阶段
在 z/OS 系统中基础控制程序和JES2 共同分担对作业的管理任务。JES2 负责将作业输
入系统,然后由基础控制程序负责为作业分配设备并真正控制程序的运行,最终JES2 负责
管理作业的输出。下图简单表示了作业处理的六个阶段:
在上图中我们可以发现多个作业队列,在这些作业队列中分别包含了处于不同阶段的作 业。例如:
转换队列中包含等待运行的作业
运行队列中包含正在运行的作业
输出队列中的作业在等待它们的运行结果产生
硬拷贝队列包含所有已经产生运行结果的作业
清除队列包含所有等待被清除的作业
1 :.输入阶段
JES2 通过读卡机、远程终端等输入设备接收作业到系统中,这些作业是以输入数据流的方式存在。除了传统的输入设备外,输入数据流还可以来自于其它程序的输出、网络上的其它节点以及内部读卡机。内部读卡机实际上是一个用来模拟真正读卡机功能的程序,其它的程序可以通过它递交作业、向 JES2 发送命令。任何在 z/OS 系统中运行的作业都可以通过内部读卡机将输入数据流传递给 JES2,并且 JES2 可以通过多个内部读卡机同时接收多个作业。
z/OS 可以通过在系统初始化时创建的内部读卡机向 JES2 传递多种信息,如所运行任务的作业控制语言、START 和 MOUNT 命令、TSO LOGON 申请等。
在 JES2 接收输入数据流的同时,也为每一个作业分配一个作业标识符并将每一个作业
的JCL、JES2 的控制语句和作业的输入数据 SYSIN存放在 DASD数据集中,这些数据集被
称为 SPOOL 数据集。JES2 就是从这些 SPOOL 数据集中选择作业进行处理。
2. 转换阶段
JES2 通过一个转换程序对每一个作业的 JCL 语句进行分析。转换程序读出作业的 JCL 语句,并将其中用来调用库程序的语句用程序库(如SYS1.PROCLIB)中的JCL 语句进行替换, 然后将结合后的JCL 程序转换成JES2 和z/OS 的调度模块都可以识别的转换/解释文本。JES2
将这些转换/解释文本存储在 SPOOL 数据集中。如果在转换过程中发现JCL 语法错误,JES2
将发送消息,然后相关作业将跳过运行阶段进入输出阶段的作业队列;如果没有发现 JCL
语法错误,相关作业将进入运行阶段的作业队列,根据作业类别和作业优先级等待运行。
JES2 支持多个转换程序同时运行,因此作业并不能够完全按照先进先出的原则进行处理。
3. 运行阶段
在运行阶段,JES2 响应来自于z/OS 初始器的请求,从作业队列中选择等待运行的作业
并将它们送到z/OS 中。通过确认作业队列中所有作业的当前处理阶段,JES2 可以通过系统
对作业的流程进行管理。
JES2 的作业调度:为了能够对作业队列中的作业进行处理,JES2 必须和 z/OS 的初始器相互配合。一个初始器实际上就是一个系统程序,在系统初始化时这个系统程序可以被操作员用命令激活也可以随着JES2 的启动而自动启动。一个初始器可以启动一个作业,允许其和系统中正在运行的其它作业竞争系统资源。
当初始器需要启动一个作业时便从JES2 那里申请,JES2 则根据初始器所关联的作业类
和这些作业类被搜索的优先权级别选择作业。当JES2 选择了一个作业以后,便将这个作业
传递给初始器。通过将每个初始器关联一个或多个作业类,我们便可以很好的控制作业的选
择,使系统的资源得到更有效的利用。
当JES2 从所有可选的作业当中选择了最合适的作业并将这个作业传递给初始器之后,
初始器便调用解释器,解释器根据转换器产生的转换/解释文本为作业创建一个控制块。 接下来,初始器根据作业的 JCL 中第一步的要求为作业分配资源,在确认所有被分配
的资源都有效后,初始器便运行JCL EXEC 语句所指定的程序。
优选权增长:当所有的初始器全部满负荷时,系统中某些类别作业的吞吐量便会降到正
常的期望值之下。为了解决这个问题,JES2 使用了附加的调度功能,优先权增长。优先权增长可以帮助那些已经等待运行的作业在刚刚进入系统的作业之前获得一个被选择的机会。
通过优先权增长,系统可以提高那些等待运行作业的优先权级别。作业等待的时间越长,它的优先权级别就会越高,直到达到一定的限制,那么作业被选择运行的机会便越大。
JES2与基础控制程序的交互:JES2 和基础控制程序不断地进行沟通以控制系统的处理
过程,这种沟通是通过子系统界面来完成的。子系统界面允许z/OS 向JES2 发出服务申请。
例如,可以申请JES2 去查找一个作业、处理消息或命令、打开或访问一个 SYSIN 或 SYSOUT 数据集。反过来,基础控制程序可以注意到JES2 的事件,如消息的发送、操作员的命令、作业的结束和任务的结束等。
4. 输出阶段
JES2 控制所有的SYSOUT 处理。SYSOUT 是系统产生的输出,也就是,系统为一个作
业或由一个作业产生的所有输出结果。这个输出结果中包括所有必须被打印的系统消息和用
户申请的必须被打印的数据集。在一个作业运行结束后,JES2 根据输出的类别和要求的设
备配置对作业所有输出的特征进行分析,然后根据相同的特征将输出分组。这些分组后的输
出将在JES2 的队列中等待打印。
5. 打印阶段
JES2 根据输出的类别和优先权等条件从输出队列中选择输出结果进行处理。位于输出
队列中的输出结果分成两类,本地处理和远程处理(RJE 工作站或网络上的其它节点)。JES2
对不同类别的输出结果进行不同的处理。
本地输出:
当输出在本地或者远程接入的设备上处理时,JES2 使用这些本地或者远程接入的设备作输出。JES2 将作业的输出数据集放在输出队列中排队。本地接入或者通过RJE 接入的活动设备,选择最符合自身特征的输出数据集进行输出。
NJO(Network Job Output)输出:
要通过另一个 JES2 节点的作业输出放入网络输出队列。JES2 根据作业的权限和到达目
点线路状况选择一个作业输出来进行传输。在目标接点发出已收到的信号后,传输 JES2
标节节点释放输出所使用的资源。 在处理完作业的的所有输出后,JES2 将作业放入清除队列。
6. 清除阶段
当作业的所有处理都结束后,可以通过 JES2 释放分配给作业的 SPOOL 空间,使这些
空间能够分配给其它作业。JES2 通过发送一条消息给操作员指出作业已经被从系统中清除。
二:JES2的性能与功能
JES2 是连接TSO/E(Time Sharing Options/Extensions)和 z/OS 的桥梁。JES2 通过 JES2
的初始化语句和 JES2 命令,提供数据处理和系统设置管理能力。
JES2 提供以下主要的功能,来管理 z/OS中作业的输入输出。所有的这些都在系统程序员的控制之下。
从 z/OS外得到作业
调度作业,优化系统效率
卸载作业和备份系统
高级打印输出
安全管理
从上面的作业系统看出,进程这个概念我还是没有找到在大机系统中的对应之物。不过,我想应该会在作业的6阶段中的运行一段当中吧,以后再看啦。。。
下面看JCL:
JCL是Job Control Language的缩写,顾名思义,作业控制语言。至于作业的概念呢上面已经讲得很清楚了。举例来说就是,当我要分配一个数据集的时候,我可以在ISPF中手动一步一步完成,也可以写一个JCL文件通过一个提交(SUBMIT)操作进行作业提交(相当于前面的6阶段中的输入)然后让系统自动完成,另外,当我写了一个PL1程序,完成源代码编辑后,我要编译它的话,要写一个JCL来完成,要运行编译得到的二进制文件,也可以写JCL文件来将这个任务提交到操作系统进行任务分配。每一个被提交的JOB,将会被操作系统添加到操作系统的任务流(JOB STREAM)中去,然后OS会根据任务的优先级以及其它条件决定何时执行这个JOB。那么我很自然地就想到了那么我如何查看我当前提交的这个JOB,以及其它的系统当前工作流中的任务呢?这时就需要使用同ISPF/PDF一样属于TSO的系统工具:SDSF,
SDSF(System Display and Search Facility)是TSO 环境下另一个常用的工具软件,其作用是对作业子系统进行控制和操作。用户通过 SDSF 可了解作业执行的情况和结果,查看作业队列,显示系统信息记录,输入系统命令等等。
SDSF的进入方式:如果ISPF主菜单界面有SDSF一项,直接输前面的代表序号即可进入,如果没有,可以进入主菜单界面的COMMAND子菜单,然后在命令行中输入SDSF回车,也可以进入。另外,在退出ISPF后,在TSO的主界面READY提示符下输入SDSF亦可进入。
进去以后,各个选项皆有注释,只整理主要的几个选项的解释:
1. DA 选项
DA 选项用来显示活动用户和地址空间,不同权限的用户看到的显示结果往往不同。只
有授权用户才能看到所有的活动用户和地址空间,其中 JOBNAME 列即为活动用户名。对具有足够权限的用户来说,该列还可以是活动作业名、地址空间名或正在执行中的程序名等。在数据行的NP 列输入 S 并回车,可以查看活动用户有关的作业和数据集信息。
2. H 选项
H 选项用来显示保留输出队列信息。用户提交的作业执行完成后的输出信息往往先保留在该队列中,等候用户进一步操作如删除、打印等。具有 OPERATION 权限的用户可以看到保持输出队列中所有作业的输出信息,普通用户则只能看到以本用户标识名为前缀的作业输出信息。其中JOBNAME 列为提交的作业名。如果用户STUD01 为普通用户,只能看
到以用户名为前缀的作业清单。和显示活动用户屏幕一样,在数据行的NP 列输入 S 并回车,可以查看作业详细清单。
3.I 选项
I 选项用来显示输入队列屏幕。用户提交的作业在处理之前先送入该队列等候作业子系
统的调度。具有特殊权限的用户还可以通过该选项显示系统调度的执行程序或启动任务等。
该屏幕显示内容和保持输出队列基本相同。
4. O 选项
O 选项用来显示输出队列屏幕。用户请求打印的作业一般先送入该队列等候输出。对于正在打印的作业,输出队列屏幕指明了有关打印的状态信息。该屏幕显示内容和保持输出队列也基本相同。
5. ST 选项
ST 选项用来显示作业系统中各作业、执行程序以及分时用户的有关状态信息,包括作 业名(用户名)、优先级、输入级别、当前状态等等。
6. PR 选项
PR 选项用来显示作业系统定义的所有打印机信息,包括本地打印机和远程打印机。显 示的打印机信息包括打印机名、状态、打印作业名、页面定义等等。
在使用SDSF的过程中,你会发现:大多数 SDSF 子选单窗口都是类似的,一般主要由提示信息、信息列表、命令输入行组成。提示信息提示当前所处的选项位置以及命令处理结果等;信息列表由表头和数据行组成,列表表头根据不同子选单内容各异,但是都有一个NP 列,用户可在数据行该列位置处输入控制命令,这种命令通常由一到两个字符组成,被称为作用字符(Action Char )。
常用的作用字符有:
// :块定义,通过一对“// ”标志多行数据以便对它们进行相同的操作;
=:重复上一个作用字符;
+:扩展NP 列,可用RESET 命令还原;
?:显示输出信息数据集列表;
A:释放保持队列中作业的输出结果;
C:清除作业的输出结果;
CD:清除作业的输出结果并生成备份;
D:显示详细信息;
E:重新启动作业或打印操作;
F:设置打印机的空白页;
H:保留作业的输出结果;
I:中断一个打印操作;
L:在日志中列出作业的输出结果;
N :打印作业输出结果;
O:释放输出结果送打印机;
P:清除一行列表数据;
Q:显示输出数据集的输出描述信息;
S:显示输出结果数据集
SB:使用ISPF 下的浏览工具显示输出数据集;
SE:使用ISPF 下的编辑工具编辑输出数据集;
SJ:使用ISPF 下的编辑工具编辑相应的JCL 作业;
Z:暂停打印操作;
X:打印输出数据集;
应该注意的是,以上这些作用字符并非适用于所有 SDSF 子选单窗口,例如有关打印控
制的作用字符大都只能在打印机选项屏幕下使用。
除了在NP 列输入作用字符完成一定功能外,用户还可以在“COMMAND INPUT”处
输入 SDSF 命令,用来控制数据行的显示或控制作业子系统的操作。常用的 SDSF 命令有:
(1) ABEND
该命令用来中止并退出 SDSF,当SDSF 出现错误使用户无法正常退出时可使用该命令。
(2) COLS
该命令将在数据输出窗口显示一个标尺,用户通过该标尺可方便地得到屏幕任意字符所在的列号。
(3) DEST
该命令可限定数据行的输出,只显示带有指定目的名的作业。例如使用命令:
DEST MYDEST
将只显示所有以MYDEST 为目的名的作业。不加任何参数使用DEST 命令将不限制作
业的目的名。
(4) FILTER
该命令将根据指定的限制条件筛选显示的数据行。其格式为:
FILTER 列名 比较符 值
其中列名因 SDSF 下各子选单而异,比较符可为:
EQ 或 = :等于
NE 或 ? :不等于
LT 或 < :小于
GT 或 > :大于
LE 或 <= :小于或等于
GE 或 >= :大于或等于
例如使用命令:
FILTER PRTY GE 3
将只显示优先级大于或等于 3 的作业。可使用命令FILTER OFF 取消数据行显示的限制条件。
(5) OWNER
该命令可限定数据行的输出,只显示指定所有者名的作业,其中所有者名可包含通配符。 例如使用命令:OWNER JIM
将只显示所有者为JIM 的作业;使用OWNER T*命令可显示所有者名以T 开头的作业;
不带参数地使用该命令将不限制作业所有者。
(6) PREFIX
该命令可限定数据行的输出,只显示指定作业名前缀的作业。例如使用命令:
PREFIX STUD01
将只显示作业名前缀为 STUD01 的作业;而使用命令PREFIX STUD* 则只显示前缀以
STUD 开头的作业;不带参数地使用该命令则不限制作业名前缀。
(7) RESET
该命令重新设置显示屏幕,将取消已经输入的作用字符以及标尺等。
(8) SELECT
该命令可根据给定的作业名和作业号选择作业。例如:
SELECT STUD* JOB00023
将选择作业名以 STUD 开头,作业号为JOB00023 的作业。
(9) SET DISPLAY
该命令可控制是否根据PREFIX、DEST、OWNER 命令限制屏幕的显示。可通过命令:
SET DISPLAY OFF
取消所有限制条件,显示队列中所有能看到的作业。
(10) SORT
该命令用来对数据行进行排序显示。其格式为:
SORT 主排序列名 A|D 辅排序列名 A|D
其中A 表示升序排列,D 表示降序排列;辅排序部分可以省略。例如使用命令:
SORT JOBNAME A JOBID D
可首先以作业名升序排列,相同的作业名则以作业号降序排列。
(11) WHO
该命令显示当前用户的TSO 属性,如用户号、登录过程名、终端特性等。
除了上述常用命令外,命令行还可输入屏幕滚动控制命令,这类命令与ISPF/PDF 环境
下的命令类似,这里就不再赘述了。其它非常用的作用字符和 SDSF 命令可通过联机帮助获得详细的说明。应该注意的是,许多 SDSF 命令需要一定的权限才能执行,或者不同权限执行结果不同。
大概学习了一下SDSF以后再次回到我的JCL上来:
当然一个JOB也可以包含多个动作,构成一个工作序列。那么按上面一说,我好像可以将JCL的作用以及写法理解为可能跟WINDOWS或者UNIX系统中的批处理文件的作用和写法类似。或者是WINDOWS下的脚本文件。同理,UNIX下的SHELL也可以看成是一种JCL。
总得来说呢,与COBOL等一般的编程语言不同,作业控制语言JCL(Job Control Language)是用户与操作系统的接口。用户通过JCL的相应语句来与操作系统通讯,获得作业所需的资源等,按自己的意图来控制作业的执行。
那么一个JCL文件如何告诉操作系统它的要求呢?这就跟其它别的语言一样,取决于其编写语法。
一个作业中,每一段程序的执行称为一个作业步,一个作业可包含一个或多个作业步。
一般的,作业由以下相对独立的三步组成:
(1)编译:把源程序语句(源模块)转换成目标模块;
(2)链接编辑:把目标模块同子程序库中的其他程序链接起来得到可执行模块;
(3)执行:运行可执行模块得到结果。
(感觉上面这一段讲得不对劲,一个COBOL,或者PL/I程序的执行步骤的确是如上三步,但是一个JCL作业提交好像不是照这么来的吧???估计他是以编译执行一个通用程序做为一个作业的例子,然后打算把其中的那三个步骤分解为三个作业步)
一个作业中的各个作业步是顺序执行的,因此一个作业步的输出可以作为下一个作业步的输入。
用户的作业可以由一个或多个作业步构成。只有一个作业步的作业叫做单步作业;由多个作业步构成的作业叫做多步作业。不论单步作业还是多步作业都必须包含三个 JCL 基本语句(JCL Statement)。它们分别是:
(1)作业语句(JOB ):标识一个作业的开始,提供必要的运行参数。
(2 )执行语句(EXEC ):标识一个作业步的开始,定义本作业步所要执行的程序或过 程。
(3)数据定义语句(DD ):用于描述应用程序所需要的数据文件。
系统规定这三种语句行必须以“// ”开头。下面是一个多步作业的例子:
//JOB1 JOB …
//STEP1 EXEC …
//DD1 DD … 作业步 1
//STEP2 EXEC …
//INDD1 DD … 作业步2
//INDD2 DD …
//
除了上述一些基本概念,有关数据结构和存取方法的概念在 JCL 的使用中也是非常重要的,由于这一部分已在前面详细讨论过,这里就不再重复了。
JCL 语句 :
JCL 语句的分类
作业控制语言 JCL 由九种语句组成,除了上一节中讨论过的三种基本语句外,还有以下六种附加语句:
(1)/* 语句:表示流内数据结束或调用JES 控制语句;
(2 )//*语句:注释语句,由第4 到第80 列写出注释内容;
(3 )//语句:空语句,用以标记一个作业的结束;
(4 )PROC 语句:流内过程(IN-STREAM PROCEDURE)或编目过程(CATALOGED PROCEDURE )的起始标记。
(5)PEND 语句:标志一个流内过程的结束。
(6)Command 语句:操作员用这个语句在输入流中写入操作命令。
在这九种语句中,JOB、EXEC 和DD 三种语句对于每个作业来说都是必要的。
下面给出一个单步作业的JCL 实例:
//BACKUP JOB ,’EXAMPLE JOB’
//************************
//* IT IS A EXAMPLE! *
//************************
//STEP1 EXEC PGM=IEBGENER
//STEPLIB DD DSN=SYS1.LINKLIB,DISP=SHR
//SYSIN DD DUMMY
//SYSPRINT DD SYSOUT=A
//SYSU1 DD DSN=PR.MASTER,DISP=OLD
//SYSU2 DD DSN=PR.MAILY.BACKUP,DISP=(NEW,CATLG),UNIT=TAPE,
// DCB=(RECFM=FB,LRECL=200,BLKSIZE=1000)
//
在上述例子中,我们给出了一个名为BACKUP 的单步作业,在这个作业中我们通过调用实用程序 IEBGENER 完成了将PR.MASTER 数据集备份到磁带上的工作。通过该例我们可以初步了解 JCL 中各语句的使用方式,下面我们将详细向大家介绍JCL 的语法规则及语句的使用。
JCL 的语法规则
与其它计算机语言一样,JCL 有一套严格的语法规则。但与我们熟知的一些编程语言不
同的是,JCL 还有其严格的语句格式规范。用户只有严格按照这些规则来编写作业控制程序,
系统才能按照其意图正确完成用户的作业,否则系统就会给出错误信息,或产生不可预知的
后果。
一、 JCL 字符集
(1) 字母(共26 个) A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
(2 ) 数字(共10 个) 0 1 2 3 4 5 6 7 8 9
(3 ) 特殊字符(共10 个) , . / ‘ ( ) * & + - =
(4 ) 通配符(共6 个)
@ $ # (也可分别用X’7C’ X’5B’ 和 X’7B’表示)
(5) EBCDIC 可打印字符集 使用十六进制值表示:X’40’ ~ X’FE’
在JCL 语法中会用到一些特殊字符,其作用列表如下表4-1:
二、 一般语句格式规范
在JCL 中,除/*语句外的所有语句均以第 1、2 列的//符号作为开始标志,系统规定这些语句的长度为 80 列。这 80 列在逻辑上被划分为五个区域,分别是标识符区、名字区、操作符区、参数区和说明区,即:
标识符区 |
名字区 |
操作符区 |
参数区 |
注释区 |
// |
名字 |
操作符 |
参数 |
注释 |
l 标识符区
一般 //”,该符号表明该条语句为 JCL 语句。标识符区位于每条语句的第 1、2 列。
在特殊情况下,标识符区的符号将有所变化。如 3.2.1 中所讨论过的“/*”语句和“//*
语句,则分别在标识符区中使用的符号“/*”和“//*”表示。
l 名字区
名字区指明一个语句,便于系统控制块或其他语句引用它。名字可以由 1~8 个字母数字或通配符组成,但第一个字符 3 列开始。名字区后必须跟一个或多个空格,可以选择名字表达出这个 JCL 语句的作用。下面给出几个正确与错误的名字区的例子:
正确的 错误的
//Z //9Z
//BACKUP#1 //TAPEBACKUP
//#99 //TEST*9 (?)
//$EXAM //EXAM(0)
l 操作符区
操作符区位于名字区之后,规定了语句的类型:JOB、EXEC、DD、PROC、PEND,或操作员命令。名字区后必须跟一个或多个空格。例如:
//EXAMPLE JOB
//STEP1 EXEC
//INDD1 DD
l 参数区
参数区在操作符区之后,其中包括被逗号分隔的参数。这些决定该 JCL语句如何被处理。
参数区没有固定的长度及列的要求。例如:
//EXAMPLE JOB 2000,CLASS=A
//STEP1 EXEC PGM=IEYFORT
//PRINT DD SYSOUT=A
l 注释区
说明区位于参数区后,用于对相应语句进行注释说明,它可以是任何所需的说明信息,
注释区后必须跟一个空格。需要注意的是,仅当参数出现时才能书写说明信息,不然容易与参数混淆。下面是一个说明区的例子:
//EXAMPLE JOB ,CLASS=A IT IS A COMMENT
JCL 只允许在参数区和说明区有续行,当需要续行时,在当前行的第 71 列前必须将某
个参数或某个子参数以及参数后的逗号写完整,且下一行第 1、2 列为“//”,第 3 列为空格,续行的内容只能从 4~16列开始,如果从 16 列后开始,将被认为是注释语句。下面是一个续行的例子:
//DATA DD DSN=SYS1.FORTLIB,
// DISP=OLD
三、 参数规则
在 JCL 中,参数区内的参数的类型分为两类:
(1) 位置参数(positional):与其他参数保持相对位置的参数;
(2) 关键字参数(keyword):由一个关键字和等号后面的可变数据组成。
如果在一个语句内既有位置参数又有关键字参数时,所有的关键字参数必须位于位置参
数之后。例:
//EXAMPLE JOB 2000,CLASS=A
位置参数 关键字参数
一个位置参数或关键字参数中的可变数字,也可能是一个子参数表。该表中同样可能含
有位置和关键字这两种类型的参数,它们同样遵循位置参数和关键字参数的所有规则。当参
数有子参数时,子参数必须顺序排列在圆括号括内。例:
//EXAMPLE JOB (2000,100,30),COND=(9,LT)
在了解参数类型的概念后,我们总结出参数的书写规则如下:
1.位置参数和关键字参数之间必须用逗号分开,不允许有空格。值得注意的是,在 JCL
语句中错写空格,经常导致非常难以查出的错误。
正确的 错误的
//EXAMPLE JOB 2000,CLASS=A //EXAMPLE JOB 2000, CLASS=A
//EXP JOB (2000,9),CLASS=A //EXP JOB (2000,9)CLASS=A
2.必须按规定的次序书写参数:所有的关键字参数必须位于位置参数之后,而所有位
置参数也必须按规定排列。
正确的 错误的
//EXAMPLE JOB 2000,CLASS=A //EXAMPLE JOB CLASS=A,2000
3.当缺省某个位置参数或某个子参数时,应以一个逗号指明所在位置。当缺省最后一
个位置参数时,逗号可以省略。例如:
//EXP JOB (2000, ,9),CLASS=A
//SYSTEM JOB ,SYSTEM,CLASS=S,MSGLEVEL=(0,0)
4. 当没有任何位置参数时,则不必书写任何内容表示。例如:
//EXP JOB CLASS=A
5.关键字参数之间没有相对位置的规定,可以按任何次序排列。例如:
//EXP JOB 2000,CLASS=A,MSGLEVEL=1
也可写作:
//EXP JOB 2000, MSGLEVEL=1,CLASS=A
6.允许含有特殊字符的参数或子参数,且其中的特殊字符并非起某种特定的语法功能
(见前面表 )时,必须用撇号“’”替代括号将这些参数和子参数括起来,例:ACCT=’123+456’。而在这些参数与子参数中要用到撇号时,则需两个连续的撇号表示,例:O’NEIL 需写作’O’’NEIL’。有些语句中的某些参数或子参数含有一些特定的特殊字符时,将不需要用撇号括起来,详细的情况清参考表 3.2.2。在表 3.2.1 中我们可以知道,在 JCL 中用“&”来表识符号参数的开始。当参数中含有“&”且不用来表示符号参数时,则需使用连续的两个“&”来表示“&”。例:
//S1 EXEC PGM=IEFBR14,ACCT=’&&ABC’
//DD1 DD DSN=&&TEST,UNIT=SYSDA,SPACE=(TRK,(1,1))
MVS系统中,系统将视连续的两个“&”为一个字符。所以建议用户将含有“&”的参
数用撇号括起来以避免出错。