JCL - MVS:如何从批量提交 MVS 命令中检索结果

Posted

技术标签:

【中文标题】JCL - MVS:如何从批量提交 MVS 命令中检索结果【英文标题】:JCL - MVS: how to retrieve result from submiting MVS command in Batch 【发布时间】:2018-04-09 16:27:25 【问题描述】:

早安,

在批量提交MVS命令后,我想知道是否可以将结果打印到seq文件中。感谢您的宝贵时间。

//S02IEBG  EXEC PGM=IEBGENER                     
//SYSUT2   DD SYSOUT=(A,INTRDR),DCB=BLKSIZE=23440
//SYSIN    DD DUMMY                              
//SYSOUT   DD SYSOUT=*                           
//SYSUDUMP DD SYSOUT=*                           
//SYSUT1   DD *,DLM=$$                           
/*$VS,'$DQ'                                      
$$ 

【问题讨论】:

不清楚要保存到顺序数据集的内容。是跑步的结果吗?换行怎么样//SYSPRINT DD SYSOUT=* 感谢 NoChance,我确实尝试过该行但它不起作用。 您已经提出了一些建议,但说“没用”并没有帮助,因为您没有说它是如何不起作用的。您还没有回答关于您在顺序数据集中(不是“文件”)中究竟想要什么的问题 - 作业的总输出、IEBGENER 的输出或写入系统之一的命令的输出日志。 @NicC 我开始认为他想要所有的日志,而不仅仅是 SYSOUT,这会有所不同。 【参考方案1】:

您的问题并不清楚,但如果您的意思是“提交您的工作后,您能否将输出捕获到数据集”,我建议您使用 XDC 行命令可持续发展基金会。如果您想要输出的特定部分,请先使用? 行命令来显示每个输出,然后在要保存的那个上使用XDC

【讨论】:

【参考方案2】:

是的,可以将 SYSOUT 写入顺序文件。我以前做过,但除非你绝对需要,否则我不会推荐它。

您的系统应该有一些 SYSLOG 管理系统(如 SMR/JMR 或类似系统),您可以在其中浏览作业产生的 SYSOUT。不要误会我的意思,我知道这不是万无一失的。有时您可能需要将 SYSOUT 写入文件。我需要这样做的原因是因为我循环了很多调试显示并且需要有很多行来帮助我调试。

如果您想确保 SYSOUT 进入文件,您只需将文件放在 SYSOUT 之后:

//S02IEBG  EXEC PGM=IEBGENER                     
//SYSUT2   DD SYSOUT=(A,INTRDR),DCB=BLKSIZE=23440
//SYSIN    DD DUMMY                              
//SYSOUT   DD  DSN=YOUR.SYSOUT.FILE, 
//         DISP=(NEW,CATLG,DELETE), 
//         UNIT=TEST,SPACE=(TRK,(2,1),RLSE), 
//         DCB=(LRECL=080,BLKSIZE=0,RECFM=FB)                           
//SYSUDUMP DD SYSOUT=*                           
//SYSUT1   DD *,DLM=$$    

如果需要,您可以通过编辑SPACE 参数来更改文件的大小。如果您计划多次运行此作业,则需要在此之前添加一个删除步骤,或者使您的 SYSOUT 文件成为可以递增的 GDG。否则,NEWDISP 将不起作用。

只要您知道正确的文件分配是什么,任何 DD 名称都可以做到这一点。

【讨论】:

感谢您的建议,但我之前尝试过,但 sysout 行不起作用。 在下面的示例中,您正在调用 IEBGENER 步骤,您希望在 SYSOUT 中看到什么【参考方案3】:

我相信以下方法可能有效。假设您要捕获 DQ 命令的输出:-

//SDSF  EXEC PGM=SDSF
//ISFOUT DD SYSOUT=*
//CMDOUT DD DSN=YOUR.DATASET,
//          DISP=(,CATLG,DELETE),
//          DCB=(RECFM=FBA,LRECL=133,BLKSIZE=0),
//          SPACE=(CYL,(1,1)),UNIT=SYSDA
//ISFIN  DD *
  SET CONSOLE BATCH
  SET DELAY 60
  /$ DQ 
  PRINT FILE CMDOUT
  ULOG
  PRINT
  PRINT CLOSE
/*
// 
显然,这可能需要根据您网站的要求进行定制。

您可能会发现Issuing MVS or JES commands 很有帮助。

补充说明:-

我确实尝试过 SDSF,但我无权使用它,这就是为什么我 我正在寻找另一种方式。

也许然后按照以下方式使用 TSO/E (REXX):-

在 TSO/E 中,您可以使用 TSO/E 控制台命令。激活控制台会话后,您 可以发出 MVS™ 系统和子系统命令并获取命令 回应。本附录描述了不同的命令和 您可以在 REXX 执行程序中使用的函数来设置和使用控制台 会话。

Writing REXX Execs to perform MVS operator activities

但是,如果不是立即,也许一旦有人在你绕过已经关闭的门时,权威可能会成为一个问题。

这可能有效(我没有测试它的设施):-

/* REXX */
ADDRESS TSO 'CONSPROF SOLDISPLAY(NO)'
ADDRESS TSO 'CONSOLE ACTIVATE'
ADDRESS CONSOLE '$DQ'
/* retrieve output command */
max_iterations = 100
DO i = 1 to max_iterations
   messages_remaining = GETMSG('line.','SOL',,,10)
   IF messages_remaining = 0 THEN leave
END
/* Done so echo retrieved messages
say 'Messages Retrieved are :-'
DO i = 1 to line.0
   say '*** ' line.i
END
ADDRESS TSO 'CONSOLE DEACTIVATE'
EXIT

您需要将其包装到您的批处理作业中,因此您可能会发现以下内容很有帮助

How can I run my Rexx program as a batch job?。 方法 2 比较合适,因为您需要一个 TSO/E 环境

解决方案可能是与负责拒绝访问 SDSF 的人交谈,这可能会导致授予权限。再次,它可能会导致打开的门,例如能够发出 JES 命令被关闭。

【讨论】:

感谢 MikeT,我确实尝试过 SDSF,但我无权使用它,这就是为什么我正在寻找另一种方式。 @franktemp 嗯。我猜你当地友好的系统程序员会对你发出 JES 命令感到非常高兴(不)。 :)。当然,你可以使用如果我不应该这样做,那么你的工作就是阻止我这样做。当然,我从来没有去过那里做那件事:)【参考方案4】:

您可能有权访问 SDSF 来查看输出。

在您要打印的作业旁边键入 xdc,这将弹出一个用于数据集分配的面板(或者它可以是已经存在的)。完成后,它将打印输出并关闭它。

如果您只需要某个步骤/系统输出的输出,您可以键入 ?在 SDSF 的工作旁边。这将为您提供输出列表。与之前相同,在您选择并分配数据集的旁边键入 xdc。

如果您直接使用命令并且需要了解它的历史记录,也可以对您的 TSO 会话执行此操作。虽然这仅在您关闭 SDSF ULOG 之前有效。

【讨论】:

以上是关于JCL - MVS:如何从批量提交 MVS 命令中检索结果的主要内容,如果未能解决你的问题,请参考以下文章

mybatis批量提交

从 java 程序中读取 MVS DataSet

zosftplib submit_wait_job(jcl) 函数不接收 JES 输出

如何将 Qt 5.6 与 MVS 2015 链接?

MVS 社区和 cURL c++

PL/I 程序中的 z/OS MVS 和 z/OS UNIX 互操作?