【问题标题】:Run step when previous JCL step did not find file上一个 JCL 步骤未找到文件时运行步骤
【发布时间】:2021-06-13 05:25:57
【问题描述】:

在下面的 JCL 中,HFS 路径 /u/woodsmn/jjk 不存在。它会引发 JCL 错误并且不运行 COPYHFS 步骤,也不运行任何其他步骤。我希望它检测丢失的文件,并运行 FAILIND 步骤。

我怀疑 MVS 会引发 JCL 错误并完全忽略任何可能适用的 COND 条件。我希望它会引发一些失败步骤条件代码并以这种方式表现。

当 PATH 不存在时,我如何重写它来执行步骤?

//WOODSMN1 JOB (1111),MSGLEVEL=(1,1),CLASS=A,MSGCLASS=H,       
//  USER=WOODSMN,REGION=1M                                     
//COPYHFS EXEC PGM=IKJEFT01                                    
//INHFS  DD PATH='/u/woodsmn/jjk',                             
//          PATHOPTS=(ORDONLY),RECFM=VB,LRECL=255,BLKSIZE=32760
//OUTMVS DD DSN=WOODSMN.TESTDS1,                               
//          DISP=(NEW,CATLG,DELETE),                           
//          SPACE=(TRK,(1,1)),                                 
//          DCB=(LRECL=80,RECFM=FB,BLKSIZE=8080)               
//SYSTSPRT DD SYSOUT=*                                         
//SYSTSIN  DD *                                                
OCOPY INDD(INHFS) OUTDD(OUTMVS) CONVERT(NO)                    
/*                                                             
//*                                                            
//NETVIEW EXEC PGM=IEFBR14,COND=(0,EQ,COPYHFS)                 
//*                                                            
//SUCCIND EXEC PGM=IEBGENER,REGION=1M,COND=(0,EQ,NETVIEW)  
//SYSPRINT DD SYSOUT=*                                     
//SYSUT1 DD *                                              
Attempt to put file succeeded                              
/*                                                         
//SYSUT2 DD PATHOPTS=(ORDWR,OTRUNC,OCREAT),PATHMODE=SIRWXU,
//  PATHDISP=(KEEP,DELETE),                                
//  PATH='/u/woodsmn/TESTDS.SUCCESS'                       
//SYSIN DD DUMMY                                           
//*                                                        
//FAILIND EXEC PGM=IEBGENER,REGION=1M,COND=(0,GT,NETVIEW)  
//SYSPRINT DD SYSOUT=*                                     
//SYSUT1 DD *                                              
Attempt to put file failed                                 
/*                                                         
//SYSUT2 DD PATHOPTS=(ORDWR,OTRUNC,OCREAT),PATHMODE=SIRWXU,
//  PATHDISP=(KEEP,DELETE),                                
//  PATH='/u/woodsmn/TESTDS.FAIL'                          
//SYSIN DD DUMMY                                           
//

【问题讨论】:

  • 如果您只想测试数据集是否存在,请使用实用程序并检查返回码。您无法检查 JCL 中是否存在数据集。对于 MVS 数据集,您可以使用 idcams。在 JES3 中的内存中,您会在作业开始之前收到 JCL 错误。在 JES2 中,作业在步骤开始时失败。你能告诉我们你使用的是哪个版本的 JES

标签: zos jcl mvs


【解决方案1】:

使用BPXBATCH 执行shell 命令来测试您的目录是否存在。

//EXIST001 EXEC PGM=BPXBATCH,PARM='SH test -e /u/woodsmn/jjk'
//STDOUT   DD  SYSOUT=*
//STDERR   DD  SYSOUT=*

您可能需要变得更加奇特,并使用 STDPARM DD 传递一个 `set -o errexit' 以使返回代码完全按照您的意愿工作。

【讨论】:

  • 感谢你们两位深思熟虑的回答。数据集检查的原因部分是因为我想确保 Netview 步骤完成。我不知道如何将条件代码返回到 USS。
  • 我还想将 HFS 文件复制到 MVS 数据集中。以某种方式在脚本中执行它会更好吗?
  • @Woodsman 根据您的环境和您的总体目标,您最好在脚本中完成所有工作。不同的 IT 商店有不同的规则。在给定的上下文中,什么是被认为是最好的,有很多输入。
  • 您也可以使用test 来检查是否存在经典数据集,我发现这非常有用。 'SH test -e //''MYTSOID.SOME.DATA.SET'''
【解决方案2】:

有两件事要改变:

首先,运行IKJEFT1B而不是IKJEFT01,因为前者将在SYSTSIN中的命令以非零返回码结束时结束,并且该返回码将成为步骤返回码。

其次,在OCOPY 之前使用ALLOC 命令分配z/OS UNIX 文件。如果ALLOC 无法分配文件(无论出于何种原因),它将返回 RC=12。

所以,你的第一步应该是这样的:

//COPYHFS  EXEC PGM=IKJEFT1B                                    
//OUTMVS   DD DSN=WOODSMN.TESTDS1,                               
//            DISP=(NEW,CATLG,DELETE),                           
//            SPACE=(TRK,(1,1)),                                 
//            DCB=(LRECL=80,RECFM=FB,BLKSIZE=8080)               
//SYSTSPRT DD SYSOUT=*                                         
//SYSTSIN  DD *                                                
  ALLOC F(INHFS) PATH('/u/woodsmn/jjk') -                               
        PATHOPTS(ORDONLY) RECFM(V B) LRECL(255) BLKSIZE(32760)

  OCOPY INDD(INHFS) OUTDD(OUTMVS) CONVERT(NO)                    
/*                                            

然后您可以照常测试COPYHFS 步骤的返回码。 (顺便说一句,您不需要 NETVIEW 步骤,而是直接测试来自 COPYHFS 步骤的返回码。)

IKJEFT1B,以及IKJEFT01,以及第三个变体IKJEFT1A在手册z/OS TSO/的附录A.执行终端监控程序中进行了描述E 定制.

【讨论】:

  • 我也喜欢你的解决方案,但我已经选择了 BPXBATCH。我希望我可以将两者都标记为有效答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多