Mainframe TSO/ISPF中REXX如何捕获JES2编译输出SYSPRINT?
需求与问题
现有REXX程序从TSO命令行接收COBOL程序名作为参数,通过调用JCL完成该程序的编译。当前程序仅能提示作业提交成功,无法获取包含编译错误信息的SYSPRINT输出,需要实现捕获或直接显示该输出内容。提交作业后程序会返回原TSO界面。
原REXX代码
ARG_SRC_COM: PROCEDURE ARG MEMBER1 MEMBER2 IF MEMBER2 = " " THEN DO EXIT; END ADDRESS TSO ADDRESS ISPEXEC "VPUT (MEMBER2) SHARED" ADDRESS ISPEXEC "VIEW DATASET('#5220.DEV.JCLLIB(COMPILEX)') MACRO(MYMACRO)" "CONTROL NONDISPL ENTER" EXIT RETURN 0
原宏代码
ADDRESS ISREDIT 'MACRO' ADDRESS ISPEXEC "VGET MEMBER2 SHARED" ADDRESS ISREDIT "CHANGE "MEM" "MEMBER2" ALL" ADDRESS ISREDIT 'SUB' ADDRESS ISREDIT 'CANCEL' EXIT;"END"
解决方案
要捕获SYSPRINT编译输出,需从JCL输出定向和REXX作业状态查询+输出读取两方面修改:
1. 修改编译JCL(COMPILEX)
将SYSPRINT输出定向到可被REXX访问的数据集,示例如下:
//COBOLC EXEC PGM=IGYCRCTL,PARM='SOURCE,OBJECT,RENT' //SYSPRINT DD DSN=&SYSUID..COMPILE.OUT(&MEMBER),DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(1,1),RLSE),DCB=(RECFM=FBA,LRECL=133,BLKSIZE=0) //SYSIN DD DSN=#5220.DEV.COBOL(&MEMBER),DISP=SHR //SYSLIN DD DSN=&SYSUID..COMPILE.OBJ(&MEMBER),DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(1,1),RLSE),DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
该配置将SYSPRINT输出到用户前缀下的COMPILE.OUT数据集,成员名为传入的COBOL程序名。
2. 修改REXX程序,添加作业等待与输出显示逻辑
修改后代码会在提交作业后轮询作业状态,完成后读取并显示SYSPRINT输出:
ARG_SRC_COM: PROCEDURE ARG MEMBER1 MEMBER2 IF MEMBER2 = " " THEN DO EXIT; END ADDRESS TSO ADDRESS ISPEXEC "VPUT (MEMBER2) SHARED" /* 提交作业 */ ADDRESS ISPEXEC "VIEW DATASET('#5220.DEV.JCLLIB(COMPILEX)') MACRO(MYMACRO)" "CONTROL NONDISPL ENTER" /* 获取当前用户前缀 */ ADDRESS TSO "GETSYSUID SYSUID" OUT_DSN = SYSUID || ".COMPILE.OUT(" || MEMBER2 || ")" /* 轮询等待作业完成 */ DO WHILE 1 ADDRESS TSO "STATUS " MEMBER2 " JOB" IF RC = 0 THEN LEAVE CALL SLEEP 5 /* 每5秒查询一次 */ END /* 显示编译输出 */ ADDRESS ISPEXEC "VIEW DATASET('" || OUT_DSN || "')" EXIT RETURN 0
3. 调整宏代码,传递作业ID(可选)
修改宏代码,将提交后的作业ID存入共享变量,便于REXX精准查询:
ADDRESS ISREDIT 'MACRO' ADDRESS ISPEXEC "VGET MEMBER2 SHARED" ADDRESS ISREDIT "CHANGE "MEM" "MEMBER2" ALL" /* 提交作业并获取JOBID */ ADDRESS ISREDIT 'SUB (JOBID)' ADDRESS ISPEXEC "VPUT (JOBID) SHARED" ADDRESS ISREDIT 'CANCEL' EXIT;"END"
补充说明
- 若需更可靠的作业状态查询,可使用TSO的
$HASP命令或调用IBM官方作业查询API,替代简单轮询。 - 若无需永久保存编译输出,可将SYSPRINT定向到
SYSOUT=*,再通过REXX读取JES输出队列中对应作业的SYSPRINT内容。
内容的提问来源于stack exchange,提问作者user1906668
相关产品推荐
相关产品推荐

