2.20 作业运行清单(JOB LOG)的阅读和查错
在前面介绍TSO SDSF命令时,读者已经知道如何查看你自己的作业流,但对你们的内容我们只是稍微提了一下,并没有做详细的介绍,这是因为,将这一部分内容跟过程调用一起介绍,效果会好很多。
当调用过程时,系统会将你提交的JCL语句与原来已经存放在所调用过程中的JCL语句结合在一起,将它们结合在一起的JCL语句就是系统真正执行的JCL语句,也就是所谓的生效的JCL语句。我们需要查看生效的JCL语句的原因是:
● 确保所生效的JCL语句满足我们所有的处理要求,当调用过程时,使用了参数覆盖或参数增加技术时,这一点尤其重要。
● 当作业运行出错时找出出错原因。
通过查看作业运行清单(JOB LOG),你可以检查生效的JCL语句。作业运行清单中除了可以看到生效的JCL语句外,还可以看到:
● 系统信息(System Messages)。
● 特定作业流语句的详细出错信息。
● 资源分配或作业结束的状态信息。
如果你希望在作业运行清单中看到所调用过程的JCL语句清单,就必须在你的JCL的JOB语句中将参数MSGLEVEL的第1个参数写成1,比如:
// JOB ...MSGLEVEL=1
下面显示的是我们要介绍的作业执行清单中的系统信息部分的例子。
J E S 2 J O B L O G -- S Y S T E M 7 4 9 0 -- N O D E T S T M V S 0 1 02.21.31 JOB00036---- SUNDAY, 22 AUG 2010---- 02.21.31 JOB00036 IRR010I USERID IBMUSER IS ASSIGNED TO THIS JOB. 02.21.31 JOB00036 IEF452I IBMUSERA - JOB NOT RUN - JCL ERROR 02.21.31 JOB00036 $HASP396 IBMUSERA TERMINATED
从上面的系统信息我们可以看到,该作业出错了,原因是JCL ERROR。如果你想知道到底哪些语句出错了,就要查看系统提供的详细错误信息。下面是该作业的详细错误信息。
STMT NO. MESSAGE 4 IEFC001I PROCEDURE IBMBR14 WAS EXPANDED USING INSTREAM PROCEDURE DEFINITION 7 IEF643I UNIDENTIFIED POSITIONAL PARAMETER IN THE SPACE FIELD 9 IEF643I UNIDENTIFIED POSITIONAL PARAMETER IN THE DSORG SUBPARAMETER OF THE DCB FIELD
上面的详细错误清单包含3行内容,每行有2部分,一个是JCL语句的编号(STMT NO.),另一个是错误信息(MESSAGE)。从上面的清单我们可以看到,系统提供了3条语句的信息,它们分别是第4条、第7条和第9条。
第4条是正常信息,表明你的作业流调用了过程,过程名为IBMBR14。第7条和第9条才是真正的错误信息,系统告诉你,第7条中的SPACE字段中的位置参数系统不认识(Unidentified),同样的,第9条的DSORG中的子参数系统也不认识。这些就是需要你解决的问题。
下面显示的是作业流提交以后系统产生的作业流语句的完整版本,你会发现有很多不是你在作业流或过程中写的语句。不用着急,你可以先跳过它,继续读后面的部分,搞明白了后再回过头来读它。
1 //IBMUSERA JOB 168,'NEWMAN LV',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1), JOB000036 // NOTIFY=IBMUSER 2 //IBMBR14 PROC //***************************************************************** //* DEFINE QSAM FILE //***************************************************************** //DEL110S1 EXEC PGM=IEFBR14 //QSAM1 DD DSN=&USERID..TEST.QSAM1, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(1,1),RLES), // DCB=(RECFM=FB,LRECL=80,DSORG=PS) //***************************************************************** //* DEFINE PDS FILE //***************************************************************** //DEL110S2 EXEC PGM=IEFBR14 //PDS1 DD DSN=&USERID..TEST.PDS1, // DISP=(NEW,CATLG,DELETE), // SPACE=(TRK,(1,1,5),RLSE), // DCB=(RECFM=FB,LRECL=80,DSORG=PX) // PEND 3 //DATA SET USERID=IBMUSER 4 //STEP1 EXEC IBMBR14 5 ++IBMBR14 PROC ++***************************************************************** ++* DEFINE QSAM FILE ++***************************************************************** 6 ++DEL110S1 EXEC PGM=IEFBR14 7 ++QSAM1 DD DSN=&USERID..TEST.QSAM1, ++ DISP=(NEW,CATLG,DELETE), ++ SPACE=(TRK,(1,1),RLES), ++ DCB=(RECFM=FB,LRECL=80,DSORG=PS) ++***************************************************************** ++* DEFINE PDS FILE ++***************************************************************** IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.QSAM1,DISP=(NEW,CATLG,DELETE), SPACE=(TRK,(1,1),RLES), DCB=(RECFM=FB,LRECL=80,DSORG=PS) 8 ++DEL110S2 EXEC PGM=IEFBR14 9 ++PDS1 DD DSN=&USERID..TEST.PDS1, ++ DISP=(NEW,CATLG,DELETE), ++ SPACE=(TRK,(1,1,5),RLSE), ++ DCB=(RECFM=FB,LRECL=80,DSORG=PX) IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.PDS1,DISP=(NEW,CATLG,DELETE), SPACE=(TRK,(1,1,5),RLSE), DCB=(RECFM=FB,LRECL=80,DSORG=PX)
作业流执行清单可以让你检查最终执行的作业流是否是你所想要的,它也可以帮助你区分下面几部分的不同之处。
● 你所提交的JCL语句。
● 存放在过程中的JCL语句
● 真正生效(执行)的JCL语句。
在作业清单中,你可以通过第1列到第3列的字符来区分每条JCL语句的含义。表2.5说明了这些符号所表示的JCL语句的含义。
表2.5 第1列到第3列的字符表示的JCL语句的含义
你可以根据上表中的说明对上一节所提供的完整作业执行清单做一个仔细的分析对比,看看能不能看出哪些JCL语句是真正生效的。这个留给读者作为练习。
现在我们回过头来看看如何找出我们作业流中的错误。正如详细信息中告诉我们的,第7行的SPACE参数中有一个系统不认识的参数,你找到第7行的JCL语句了吗?请注意,这里的第7行指的是生效的JCL语句中的第7行,不是你提交的JCL中的第7行,也不是你的过程语句中的第7行。好,现在终于找到第7行生效的JCL语句了吧,它就是定义QSAM1的DD语句,我们看看,SPACE参数中哪个位置参数有问题?哦,对了,我们将参数RLSE(文件可以重复使用)输入成了RLES,这就是第7行错误的原因。
同样的,第9行的JCL语句是定义PDS1的DD语句,我们把DSORG中的PO(分区数据集)输入成了PS,这就是第9行出错的原因。我们希望通过这个例子,让读者学会如何查找JCL中的错误并解决它们。