【问题标题】:How can I run my Rexx program as a batch job?如何将我的 Rexx 程序作为批处理作业运行?
【发布时间】:2016-08-10 07:48:29
【问题描述】:

我有一个想要作为批处理作业运行的 Rexx 程序。我该怎么做?

这是我的程序:-

/* Rexx – HELLO – Write Hello World */
Say "hello World"

该计划位于 PDS 中的成员 HELLO ME.USER.EXEC

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

//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID

注意!这是作为教程编写的

【问题讨论】:

    标签: batch-processing zos rexx tso


    【解决方案1】:

    您可以通过多种方式通过批处理运行程序。我将介绍 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=*
    //*-------------------------------------------------------------------
    

    这种方法虽然最简单(只需几行 JCL),但限制最大的是它不允许使用 TSO/E 服务,例如 TSO/E 命令和大部分 TSO/E 外部 功能。

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



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

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

    关于程序之间差异的综合信息 可以在Writing JCL for command execution找到

    IKJEFT01 的 JCL 与方法 1 中使用的类似。可以编写额外的 DDNAME SYSPROCSYSPROCCLISTS 所在的 DDNAME;除了 SYSEXEC 之外,您还可以在此处找到 Rexx 程序(这不是必需的,建议两者都已编码,并且 SYSEXEC 用于 Rexx 程序,SYSPROC 用于 CLISTS)。

    要求 Rexx 在第一行 将 Rexx 程序与 CLIST 区分开来(通过 TSO/E 处理器)。因此,如果通过 SYSEXEC 找到/定位了 Rexx 程序,如果我没记错的话,这否定了要求)。

    另一个建议是始终在 Rexx 程序的第一行包含 REXX>

    EXEC 语句调用 IKJEFT01 程序而不是 IRXJCLPARM 可用于指定第一个命令(因此也是我们的 HELLO 程序)。但是,对于前台,您可以通过终端指定,即 SYSTSIN DDNAME

    这里有一些适用于第二种方法的 JCL;注意 HELLO 程序是通过 SYSTSIN DDNAME 作为 instream 数据调用的:-

    //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=*
    //*-------------------------------------------------------------------
    

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

    //SYSTSIN  DD *
         HELLO
         TIME
    


    方法 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=*
    //*-------------------------------------------------------------------
    

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

    【讨论】:

      【解决方案2】:

      上述答案的其他 cmets。如果您希望使用 ISPF 服务运行您的 REXX exec,以下技术说明可能会有所帮助...

      http://www.ibm.com/support/docview.wss?uid=swg21023990

      确保将 ISPPROF 文件连接为 ISPTLIB 中的第一个文件。该示例使用一个临时文件,该文件对作业来说是唯一的。如果 REXX exec 提供表服务,您可能需要 ISPTABL DD。我建议对 ISPPROF 和 ISPTABL 使用相同的文件,并首先在 ISPTLIB 中将其连接起来。如果需要保存表,这可以是一个永久文件,但是它不应该被其他作业或 TSO 用户使用,以避免入队错误。

      正如之前的更新所说,他的回答对于简单的 REXX 执行者来说已经足够了。

      【讨论】:

        【解决方案3】:

        MikeT 的答案还有更多的补充......

        假设您希望 JCL 是自包含的:您希望将 REXX exec 作为流内数据集包含在 JCL 中,而不是引用存储在 PDS 成员中的 REXX exec。

        这里是“技巧”(对于 IRXJCL;我没有用其他程序测试过这个技巧):指定一个空 (X'00') 字节作为 EXEC 语句的 PARM 属性的值.

        要指定空字节,请使用带有HEX ON 的z/OS ISPF 编辑器:

        //REXX     EXEC PGM=IRXJCL,PARM=' '
        66DCEE44444CECC4DCD7CDEDCD6DCDD7707
        1195770000057530774E997133B7194ED0D
        

        例如,如果您输入 PARM=' ' 时使用空格作为值,则将该空格的十六进制值的 4 改写为 0

        这是一个示例作业步骤,其中包含一个流内 REXX exec,它处理同一作业中上一步的输出:

        //* PARM value is a single X'00' byte                          
        //REXX     EXEC PGM=IRXJCL,PARM=' '                            
        //SYSEXEC  DD   DATA,DLM=$$                                    
        /*                                                             
           Transposes first line of input CSV into one record per field
           Reads CSV from ddname SYSTSIN.                              
        
           Writes output to ddname SYSTSPRT.                           
        */                                                             
        columnSeparator = ","                                          
        
        /* Get the header row */                                       
        parse pull row                                                 
        /* Get column names */                                         
        do i = 1 until row = ""                                        
          parse value row with columnName "," row                      
          say columnName                                               
        end                                                            
        exit 0                           
        $$                               
        //SYSTSIN  DD  DSN=&&CSV,DISP=OLD
        //SYSTSPRT DD  SYSOUT=*          
        

        注意事项:

        • 在这种情况下,REXX exec 的第一行不需要包含字符串“REXX”
        • DLM=$$ 使您能够使用 REXX 注释语法 (/*) 而不会过早结束流内数据集
        • &&CSV 指上一个作业步骤创建的 CSV 文件(未显示)

        我主要使用这种“in-stream REXX”技术来将批处理程序的输出转换为我真正想要的。这种技术对于演示和快速反弹想法很有用;其他开发人员可以在 SDSF 输出的 JCL 中原位查看 REXX 代码,对其进行调整,然后提交调整后的版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-20
          • 2014-09-28
          • 2014-05-12
          • 1970-01-01
          • 2019-11-14
          • 1970-01-01
          • 2023-01-25
          • 2020-10-29
          相关资源
          最近更新 更多