如何将我的Rexx程序作为批处理作业运行?

Mik*_*keT 1 rexx zos batch-processing tso

我有一个Rexx程序,要作为批处理作业运行。我怎样才能做到这一点?

这是我的程序:

/* Rexx – HELLO – Write Hello World */
Say "hello World"
Run Code Online (Sandbox Code Playgroud)

该程序位于作为成员HELLOPDS ME.USER.EXEC

我的安装有效的作业卡是(我们的环境包括ISPF / PDF而不是ROSCOE):

//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
Run Code Online (Sandbox Code Playgroud)

注意!这已经被写成一个教程

Mik*_*keT 6

您可以通过多种方式来批量运行程序。我将介绍3种方式,这些方式根据环境(即它们可以利用的方式)的不同而有所不同。



方法1-在Rexx环境中运行该程序。

这需要运行程序IRXJCL并通过PARM字段传递程序名称(即PDS的成员名称)(您也可以传递参数;通过PARSE ARG语句访问它们)。

IRXJCL通常需要3个DDNAMES,它们是SYSEXEC(程序所在的PDS),SYSTSIN(这可以反映终端输入)和SYSTSPRT(这是发送终端输出的位置)。

这是将根据上面提供的信息工作的JCL

//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG  EXEC PGM=IRXJCL,PARM=’HELLO’
//*
//*        RUN OUR REXX PROGRAM CALLED HELLO
//*
//SYSEXEC  DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN  DD DUMMY
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

尽管最简单(仅几行JCL),但该方法的局限性最大,因为它不允许使用TSO / E服务,例如TSO / E命令和大多数TSO / E外部功能。

但是,由于IRXJCL是Rexx处理器,因此不需要让TSO / E知道它是Rexx程序(第一行必须包含REXX)。



方法2-从TSO / E环境运行程序

这需要运行本示例中使用的TSO / E批处理程序之一IKJEFT01。替代品为IKJEFT1AIKJEFT1B。可以通过此方法使用TSO / E服务和命令(例如,使用TIME命令在此方法末尾的注释

可以在编写JCL以便执行命令时找到有关程序之间差异的全面信息。

IKJEFT01的JCL 与方法1中使用的JCL 相似。可以对附加的DDNAME SYSPROC进行编码。SYSPROCCLISTS所在的DDNAME。除了SYSEXEC之外,您还可以在这里找到Rexx程序(这不是必需的,建议这两者都已编码,并且SYSEXEC用于Rexx程序,而SYSPROC用于CLISTS)。

要求Rexx在第一行上,以区别Rexx程序和CLIST(由TSO / E处理器处理)。因此,如果Rexx程序是通过SYSEXEC找到/定位的,如果我没记错的话,这将使要求无效。

另一个建议是在RExx程序的第一行中始终包含REXX。

EXEC语句而不是IRXJCL调用IKJEFT01程序。PARM可用于指定第一个命令(以及我们的HELLO程序)。但是,对于前景,您可以通过终端即SYSTSIN DDNAME进行指定

这是一些适用于第二种方法的JCL。注意到HELLO程序通过调用SYSTSIN DDNAME作为插播广告数据: -

//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG  EXEC PGM=IKJEFT01
//*
//*        RUN OUR REXX PROGRAM CALLED HELLO IN A TSO/E ENVIRONMENT
//*
//SYSPROC  DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC  DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN  DD *
 HELLO
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

例如,如果使用了以下命令(即,将TIME作为另一行添加到SYSTSIN),则将运行TSO / E TIME命令(这将导致时间显示到SYSTSPRT)。

//SYSTSIN  DD *
     HELLO
     TIME
Run Code Online (Sandbox Code Playgroud)


方法3-在ISPF环境中运行程序

此方法使用IKJEFT01程序(有关IKJEFT1A / B的替代方法,请参见方法2)。但是,它随后使用ISPSTART命令在ISPF环境中运行该程序。支持使用ISPF服务(例如,文件定制(框架)ISPF表等)。

ISPF环境还有其他要求,因为需要分配ISPF库才能启动ISPF环境。至少将提供的ISPF库分配给ddnames ISPPLIB(ISPF面板),ISPMLIB(ISPF消息)和ISPTLIB(ISPF表)。ISPPROF是ISPF保留会话的一些概要文件数据的地方,因此临时存储就足够了(如果不是总是,则UNIT = SYSDA通常可用)。

请注意,您可能至少会分配安装系统库(TSO / E命令LISTA可能可用于从前台会话中确定这些库)。或者,请您与本地友好的系统程序员联系。下面是SYS1.ISPPLIB,SYS1.ISPMLIB和SYS1.ISPTLIB。

这是一些适用于第三种方法的JCL。请注意,HELLO作为参数传递给ISPSTART命令。

//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG  EXEC PGM=IKJEFT01
//*
//*        RUN OUR REXX PROGRAM HELLO IN A TSO/E/ISPF ENVIRONMENT
//*
//SYSPROC  DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC  DD DSN=ME.USER.EXEC,DISP=SHR
//ISPPLIB  DD DSN=SYS1.ISPPLIB,DISP=SHR
//ISPMLIB  DD DSN=SYS1.ISPMLIB,DISP=SHR
//ISPTLIB  DD DSN=SYS1.ISPTLIB,DISP=SHR
//ISPPROF  DD UNIT=SYSDA,SPACE=(CYL,(10,1)),
//            RECFM=FB,LRECL=80,BLKSIZE=0
//SYSTSIN  DD *
 ISPSTART CMD(HELLO)
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一个全面的书,它是概述,足以开始批量运行Rexx程序。