2.2 JOB语句
JOB语句标志一个作业的开始、分配作业名并设置相关的位置参数及关键字参数,每个作业的第1个语句必须是JOB语句。JOB语句的格式如下。
//作业名JOB位置参数[,关键字参数][,关键字参数]……[注释说明]
2.2.1 JOB语句中的位置参数
正如前面介绍过的,位置参数所指的参数的特性是由其相对于其他参数的位置决定的。位置参数总是出现在所有参数的最前面,如果有多个位置参数,它们必须按照固定的先后顺序出现。
JOB语句中的位置参数如下。
● 账户信息(Job accounting information)。
● 程序员名字(Programmer name)。
位置参数要按照如下所示的顺序编写并在两个参数之间由逗号隔开。
//MYJOB1 JOB 168,NEWMAN.LV
在这个例子中,作业的账户是168而程序员名字是NEWMAN.LV。
2.2.1.1 账户信息
用于提供用户使用系统的账户,早期是用于收费管理的。该参数若未省略则必须是JOB的第1个参数。
2.2.1.2 程序员名
用于标识作业的拥有者信息。不超过20 个字符,若名字中包含有特殊字符时此参数必须由引号括起来,否则可不用引号。
如果你要将程序员名包含到JOB信息中,就必须将其紧跟在账户信息参数的后面,如果没有账户信息,就必须使用逗号以表明账户选项的省略。下面是两个输入账户信息和程序员名NEWMAN LV的例子。
//MYJOB1 JOB 268,‘NEWMAN LV’ //MYJOB2 JOB ,‘NEWMAN LV’
程序员名字要用引号括起来的原因是名字NEWMAN LV在名和姓之间有空格,而系统将空格当成特殊字符,因此必须括起来。
账户信息是JOB语句的第1个位置参数,如果你要省略账户信息而又要编写程序员名字信息,必须用逗号表明账户信息的省略。如果你既不提供账户信息也不编写程序员名字,就不必使用逗号。下面的例子说明两个位置参数都不写的例子。
//MYJOB3 JOB
2.2.2 JOB语句中的关键字参数
除了位置参数外,JOB语句也有一些关键字参数。关键字参数由关键字、等号和变量信息组成,用来提供控制信息给操作系统。
JOB语句中的关键字参数有如下几个。
ADDRSPC REGION MSGCLASS SECLABEL PASSWORD BYTES CLASS RD MSGLEVEL TIME PERFORM PAGES COND LINES CARDS TYPRUN PRTY SCHENV GROUP RESTART NOTIFY USER CCSID
JOB语句中最常用的关键字参数有:
● MSGLEVEL。
● MSGCLASS。
关键字参数的特点包括:
● 必须跟在位置参数的后面。
● 可以按任意顺序排列。
● 必须有关键字、等号和值,如CLASS=A。
2.2.2.1 MSGLEVEL
关键字参数MSGLEVEL用于控制JCL作业输出清单的内容。MSGLEVEL参数包含二个子参数即语句(Statements)和信息(Messages)。MSGLEVEL参数的编码规则是MSGLEVEL=(statements,messages)。多个子参数要像上面显示的那样用括号括起来。
语句(statement)子参数指定哪种作业控制语句要打印到作业输出(job log)中。语句子参数可以取下面的3个值。
● 0——只打印JOB语句。
● 1——打印所有的JCL语句和JES2或JES3控制语句,包括调用的过程(procedure)语句。
● 2——只打印JCL语句和JES2或JES3控制语句。
信息(messages)子参数指定哪些信息要打印到作业输出(job log)中,信息子参数可以取下面的两个值。
● 0——只打印JCL信息。如果作业异常结束,只调用JES和操作员信息。
● 1——打印所有的分配/结束信息。
下面是使用MSGLEVEL的例子。
//JOB1 JOB 168,NEWMAN,MSGLEVEL=(0,0)
这里指定只有作业语句输出到JOB LOG中,如果作业正常结束,则数据集分配或结束信息不会显示在作业输出中。
//JOB2 JOB 368,NEWMAN,MSGLEVEL=(1,1)
为了显示所有的JCL和分配或结束信息,就要像上面那样编写MSGLEVEL参数。
2.2.2.2 MSGCLASS
MSGCLASS参数用来为作业日志(job log)设置输出类别。你可以使用MSGCLASS关键字参数为你的输出清单(SYSOUT)指定一个输出类别(Output class)。输出类别是你的公司定义好的,通常与某个设备比如打印机相关联。
每个输出类别由一个字符组成,取值范围为:
● 一个字母(A~Z)。
● 一个数字(0~9)。
比如,为了将你的作业的输出类别指定为A,你可以这样编写你的MSGCLASS参数:
//MYJOB1 JOB 268,MSGLEVEL=(1,1),MSGCLASS=A
MSGLEVEL和MSGCLASS参数都可能有默认值,关于默认值的设置,你必须问你的系统管理员。在JOB语句中省略其中一个或两个都省略,系统就会为这些参数使用默认值。这种情况下,只有在你使用与默认值不同的信息级别(Mmessage Level)或输出信息类别(Message Class)时,才需要编写它们。
JOB语句中还有一些你可以使用的关键字参数,你可以使用这些参数产生你需要的结果,其中最常用的关键字参数都显示在下面,它们的使用规则与关键字参数MSGLEVEL和MSGCLASS是一样的。
COND、ADDRSPC、CLASS、NOTIFY、PRTY、REGION、TIME、TYPRUN、USER和PASSWORD
2.2.2.3 COND
条件(COND)参数指定作业(JOB)结束的条件。系统是如何检查作业结束的条件的呢?事实上,当作业中运行的程序结束时,都会产生一个返回码(Return code)来标识程序结束时的状态,比如,成功完成、完成但有警告信息或程序异常终止等。系统可以使用COND参数将你提供的值与程序的返回码进行比较,以决定是否继续执行作业中剩余的作业步。
你在JOB语句中编写的COND参数使得系统检测程序返回码与你提供的值进行比较。每个COND参数使用两个子参数。
● 代码值(Code)。
● 比较运算符(Operator)。
代码值指定要跟程序返回码比较的十进制数值,容许的取值范围为0到4095。比较运算符指定代码值如何与程序的返回码比较。下面是COND参数的使用格式。
//JOBNAME JOB…,COND=(code,operator) //JOBNAME JOB…,COND=((code,operator),(code,operator),…)
如果要比较多个返回码,你必须将每个测试用一对括号括起来,如果只是测试一个返回码,就不用额外的一对括号。每个JOB语句最多可以有8个不同的返回码,如果任何一个成立(值为真),系统就会跳过(不执行)所有未执行(剩下)的作业步。
如果你要测试多于8个的返回码该怎么办?如果你在COND参数中编写多于8个比较条件,就会在JCL运行时收到错误信息而作业也会异常终止。因此,这样做是行不通的。JCL程序员有多种不同的方法编写COND参数测试返回码,比较运算符子参数指定比较的方法。
COND子参数指定自己的操作符,它是独立于其他测试中的比较运算符的。JCL程序员决定使用哪个比较运算符。在COND参数中可以使用的各种比较运算符有:
● GT大于(Greater than)。
● GE大于等于(Greater than or equal to)。
● EQ等于(Equal to)。
● NE不等于(Not equal to)。
● LT小于(Less than)。
● LE小于或等于(Less than or equal to)。
我们看看下面一个使用COND参数的例子1。
//MYJOB1 JOB 168,NEWMAN,COND=(12,LT) //STEP1 EXEC PGM=PGMA //STEP2 EXEC PGM=PGMB
这个例子帮助你理解JOB语句中的COND参数。它的含义是:如果12小于返回码就不继续执行剩余的作业步。只有当返回码介入1到12之间时,剩余的作业步才会继续执行。如果返回码大于或等于13,剩余作业步就会跳过(不执行)。
再看看第2个例子。
//MYJOB2 JOB 368,NEWMAN,COND=(12,GT) //STEP1 EXEC PGM=PGMA //STEP2 EXEC PGM=PGMB
这个例子中的COND参数可以解读为:如果12大于任何作业步的返回码,就不继续执行剩余的作业步。换句话说,只有当返回码大于或等于12时才继续执行剩余的作业步。如果返回码为0到11,剩余的作业步就会跳过(不执行)。
再看看下面的例子3。
//MYJOB3 JOB 668,‘NEWMAN LV’, // COND=((16,LT),(8,GT)) //STEP1 EXEC PGM=PGMA //STEP2 EXEC PGM=PGMB
这个例子有多个比较关系,有些情况下可能需要这样判断。你可以这样解读JOB语句中的COND参数:如果16 小于返回码或者8 大于返回码,就不执行剩余的作业步。换句话说,继续执行后面的作业步的条件是:前面的每个作业步的返回码的值是8、9、10、12、13、14、15或16。
COND参数除了可以在JOB语句中编写外,也可以在EXEC语句中使用。
//MYJOB4 JOB 168,NEWMAN, //STEP1 EXEC PGM=PGMA, // COND=(12,GT) //DD DD DSN=IBMUSER.TEST.DATA,DISP=SHR //STEP2 EXEC PGM=PGMB
COND既可以在EXEC语句中使用,也可以在JOB语句中使用。当COND参数写在JOB语句中时,系统会首先检测它,然后再检测所有写在EXEC语句中的COND参数。一般来说,当COND参数在EXEC语句中使用时,通常用来检测特定作业步的返回码,而JOB语句中的COND参数应用于作业中的所有作业步。
2.2.2.4 ADDRSPC
如果作业中运行的程序需要在实存(Real Storage)的不可分页区(Nonpageable Area)运行,你就需要使用ADDRSPC参数。一般来说,操作系统只在程序需要运行时,才将程序从虚存调到实存中,但是,在某些情况下,程序需要使用实存中的不可分页区。
ADDRSPC参数的取值为:
● REAL(实存)。
● VIRT(虚存)。
REAL表示必须使用实存,下面是使用实存的例子。
//MYJOB1JOB …,ADDRSPC=REAL
VIRT表示必须使用虚存,下面是作业使用虚存的例子。
//MYJOB2JOB …,ADDRSPC=VIRT
如果省略ADDRSPC参数,默认值就是VIRT。因此,只有当你的作业只能在实存(Real)中运行时,才需要本参数。在JCL中编写VIRT只是起到说明的作用。一般来讲,必须在实存中运行的作业很少。
2.2.2.5 CLASS
在主机系统中,作业是按照不同的作业类型分组的。作业为什么要分组?作业分组的原因是:
● 作业分类可以在整个系统中达到各种不同类型作业之间的平衡。
● 避免使用相同资源的作业之间的冲突。
你可以在JOB语句中编写CLASS参数来指定作业的类别。作业的类别是一个字符,可以从A到Z和从0到9。作业类别的定义每间公司都不同,所以你必须问你的系统管理员,哪些类别可以给你使用。
指定合适的作业类别到各种作业中,以达到平衡使用系统资源的目的,可以最有效地使用系统资源。下面是使用CLASS参数的例子。
//MYJOB1 JOB 168,NEWMAN.LV,CLASS=A
2.2.2.6 NOTIFY
NOTIFY参数用于请求系统在后台作业处理完毕时给指定用户发送信息。NOTIFY参数指定作业执行完后要通知的TSO用户。如果你用NOTIFY参数指定你自己的TSO用户ID,作业执行完后操作系统就会自动发送作业完成的信息给你。
下面的例子将作业MYJOB1执行完后的通知对象设置为IBMUSER。
//MYJOB1 JOB ...,NOTIFY=IBMUSER
2.2.2.7 PRTY
PRTY参数用于为输入队列中的作业分配相应的优先级。PRTY参数为作业指定优先级作为系统选择作业运行的参数之一。一般来说,优先级参数可以将一个作业排在另一个同一类别的作业前运行。
对于JES2,PRTY参数的取值范围一般为0到15;而对JES3取值范围则为0到14,其中,0是优先级最低的。当同一类(CLASS相同)作业都没有指定优先级时,它们是按照先进先出的方式交由系统处理的。
如果你想将下面的作业MYJOB1的优先级指定为5,你可以像下面显示的这样指定PRTY参数。
//MYJOB1 JOB 168,NEWMAN,PRTY=5
如果你想既为作业指定类别又指定优先级,就要在JOB语句中同时使用CLASS和PRTY参数。下面的JOB语句为MYJOB1,其指定的类别为A,而在该类别内的优先级为5。CLASS和PRTY关键字参数出现的顺序是随意的。
//MYJOB1 JOB 168,NEWMAN,CLASS=A,PRTY=5
2.2.2.8 REGION
REGION参数用来指定作业所需的实存或虚存空间的大小,系统将在该作业中的每个作业步使用该值。REGION参数指定特定作业需要分配的存储空间的数量,以KB(kilobytes)或MB(megabytes)为单位。你可以使用该值覆盖你公司指定的REGION的默认值。
如果你在JOB语句中指定了REGION参数,它就会应用于该作业的所有作业步中并覆盖所有编制在EXEC语句中的REGION参数。REGION参数的格式为:
//MYJOB1JOB ...,REGION=nnnnK,其中,nnnn是需要的存储空间的值,以KB为单位 //MYJOB2JOB ...,REGION=nnnnM,其中,nnnn是需要的存储空间的值,以MB为单位
一般来说,REGION参数可以限制程序可用的虚存空间的大小。不同的程序使用不同的REGION可以得到不同的运行效率。比如,为了将MYJOB1的REGION虚存空间限制在512 KB,你可以像下面这样编写JOB语句的REGION参数。
//MYJOB1JOB ...,REGION=512K
类似地,为了将MYJOB2的虚存空间限制在1024 KB或1MB,你可以像下面这样编写REGION参数。
//MYJOB2JOB ...,REGION=1M
当你将REGION参数与ADDRSPC=REAL一起使用时,REGION指定的就是实存空间的大小。比如,下面为MYJOB3指定的实存空间大小为512 KB。
//EXJOB ...,REGION=512K,ADDRSPC=REAL
2.2.2.9 TIME
TIME参数用于指定作业占用处理器的最长时间。TIME参数指定作业可以占用处理器(CPU)的最大时间,当TIME参数指定的时间限度达到时,作业就会异常结束。TIME参数的格式是:
//JOBNAME JOB ...,TIME=(minutes,seconds)
TIME参数可以保护处理器时间以免程序出现错误,如死循环时不至于占用太多的CPU时间,程序占用的时间最多不会超过TIME参数设定的值。
下面的例子中的TIME参数将作业MYJOB1的CPU执行时间限制为2分45秒。
//MYJOB1JOB 168,HUAHUA,TIME=(2,45)
除了上面的分(minutes)和秒(seconds)子参数外,TIME参数还可以编写下面的子参数。
● 1440。
● NOLIMIT。
● MAXIMUM。
其中,子参数1440表示作业可以无限制使用CPU时间。从字面上看,子参数1440表示可以运行1,440分钟,即24小时。但是,子参数1440对操作系统有特殊的含义。
比如,为了让你的作业可以无限制运行,你可以在JOB语句中使用NOLIMIT子参数。
子参数NOLIMIT与子参数1440的含义是一样的。将TIME参数写成NOLIMIT,将容许你的作业无限制运行下去。比如,为了让下面的作业MYJOB1无限制运行,可以像下面这样编写TIME参数。
//MYJOB1JOB 168,HUAHUA,TIME=1440 //MYJOB1 JOB 168,NEWMAN,TIME=NOLIMIT
MAXIMUM子参数表示作业可以运行357,912分钟,它是操作系统除无限制外可以给予作业的最大运行时间。下面的JOB语句中的TIME参数将容许作业MYJOB1可以使用的CPU时间最多为357,912分钟。
//MYJOB1 JOB 168,HUAHUA,TIME=MAXIMUM
2.2.2.10 TYPRUN
TYPRUN参数用来请求特殊的作业处理。TYPRUN关键字参数可以有下面的子参数。
● COPY(跟JES2一起使用)
它告诉系统只是将输入作业流中的JCL语句复制到SYSOUT数据集做输出处理,但不执行它们。
● HOLD
它告诉系统先将作业挂起直到有操作员释放才运行。
● JCLHOLD(跟JES2一起使用)
JCLHOLD(JES2 only)类似于HOLD,不同的是,在JCL语句被扫描之前就HOLD住了。
● SCAN
SCAN表示作业不会执行,只是检查JCL语句的语法。下面例子中的TYPRUN参数将会告诉系统只检查作业流的语法,而不真正执行它们。
//MYJOB1 JOB 168,NEWMAN,TYPRUN=SCAN //STEP1 EXEC PGM=PROGRAMA //DD1 DD DSN=INPUT
2.2.2.11 USER参数
USER参数用来指定提交作业流的用户ID。它的子参数USERID必须是1到7位长的字母数字符号,且第1个字符不能是数字。USERID子参数可以用在许多系统功能中,这些系统功能包括:资源存取控制功能(Resource Access Control Facility(RACF))和系统资源管理功能(System Resource Manager(SRM))。
比如,假定你的TSO ID为CN0001,而它没有权限存取作业流中的某个文件,你就可以使用下面的JOB语句中的USER参数让具有该权限的用户IBMUSER来提交作业。
//MYJOB1 JOB 168,HUAHUA,USER=IBMUSER
绝大多数情况下,USER参数总是与PASSWORD参数一起使用的。
2.2.2.12 PASSWORD
PASSWORD参数用来标识当前作业的RACF密码。PASSWORD参数使用作业特定的子参数,该子参数只能是1到8个字符的字母数字。下面是PASSWORD参数的一个例子。
//MYJOB1JOB ...,PASSWORD=password
如果IBMUSER的RACF密码为ABC168,你可以将上面的JOB语句改写成:
//MYJOB1JOB 168,HUAHUA,PASSWORD=ABC168,USER=IBMUSER
2.2.2.13 多个关键字参数一起使用
单个JOB语句中可以使用多个关键字参数,它们必须出现在位置参数的后面,关键字参数可以以任何顺序出现。假定下面的作业MYJOB1只能使用CPU时间一分半钟,只能使用虚存512KB,该作业的类别为A且在该类别中的优先级为5。换句话说,MYJOB1可以比在类别A中的优先级低于5的作业之前运行。我们要求操作系统在作业执行完后通知用户IBMUSER。满足所有这些条件的JOB语句如下。
// MYJOB1 JOB 168,NEWMAN, // TIME=(1,30), // REGION=512K,CLASS=A, // PRTY=5, // NOTIFY=IBMUSER