You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:00:55