如何调试 JCL

Posted

技术标签:

【中文标题】如何调试 JCL【英文标题】:How to debug JCL 【发布时间】:2014-11-13 11:34:06 【问题描述】:

如何“调试”JCL?有没有办法显示错误或警告信息?当我提交我的工作时,输出是 MAXCC=8。但是我怎样才能知道为什么或必须搜索“错误”在哪里?

【问题讨论】:

【参考方案1】:

您实际上没有 JCL 问题。

首先,处理MAXCC,因为这会引起很多混乱。

对于有经验的人,MAXCC 仅存在于 IDCAMS(用于文件和目录操作的实用程序,定义 VSAM 文件和与这些类型相关的东西)。

JCL 中不存在 MAXCC,也不存在您从 JOB 收到的任何输出中。

MAXCC 的来源是您的 JOB 卡上的 NOTIFY 语句。我们已经多次看到通知到达,我们从未阅读过它,但它确实显示了 MAXCC。只是 MAXCC 只出现在 IDCAMS 和 NOTIFY 中,所以告诉我们它是什么会让很多人感到困惑。

CC 位是条件码。每个作业步骤都会产生一个条件代码。通常 CC 会是 00,没有什么要报告,04,一些情况,不一定很严重,08,一些情况可能很严重,12,一些严重的情况和 16,非常糟糕。

这些只是常规用途,但来自 IBM 和独立软件供应商 (ISV) 的大多数实用程序都遵守惯例。也许你偶尔会看到 20 个。可能在地震期间。

例如,如果您编译 COBOL 程序,00 表示编译器没有发现任何问题。 这并不意味着您的程序有效。这只是意味着语法没问题。 04 表示有“警告”。您应该始终检查这些,因为某些警告实际上是有问题的。 08 是严重错误,虽然生成了目标代码(除非没有通过编译器选项请求),但尝试执行它是愚蠢的(除了乐趣)。 12和16,编译器刚刚放弃,不会生成代码。

linkeditor/binder 有类似的层次结构。 00 已经准备好运行(但不能保证它会做任何接近你想要的事情),04 是一个小问题,但你会想知道什么,08 是一个问题,这可能意味着你将无法执行程序。

所有这一切的短处是,如果您的 NOTIFY 的结果是 MAXCC=08,那么您的 JOB 中至少有一个步骤 CC 为 08。您可能有多个步骤 08,并且你也可能有 00 或 04 的步骤。

与 JCL 无关。 CC 由您正在运行的程序确定,CC 在每种情况下的含义可能在细节上有所不同(例如编译器到linkeditor/binder),尽管分级通常大致相同。

您还可以从应用程序设置 CC。在 COBOL 中,您将使用 RETURN-CODE“特殊寄存器”。

MOVE 04                       TO RETURN-CODE

在执行时,假设 RETURN-CODE 稍后没有收到其他值,会从该程序的执行中获得 04 的 CC。

您的本地站点标准将规定应用程序如何指示错误:您很可能永远不会使用 RETURN-CODE。

更简短的是你有一个程序错误,你需要按照 piet.t 的建议去做。

您可能会收到与生成 CC 的步骤相关的错误消息。查找有关该消息的更多信息(除了 COBOL 编译器消息,这些消息不言自明(!))的一种快速简便的方法是使用 IBM LookAt Web 服务:http://www-03.ibm.com/systems/z/os/zos/bkserv/lookat/

粘贴您的信息,然后单击“开始”按钮。有时您需要指定 z/OS 版本。作为初学者,您总是可以做到这一点。

为了调试 JCL 本身,您可以尽可能在您的 JOB 卡上使用 TYPRUN=SCAN,或者您的网站可能有 JCL-checker 产品,尽管这些产品在更新时往往会出现很多误报因为他们试图了解控制卡对标准实用程序的影响(TYPRUN=SCAN 忽略控制卡)而落后多年。

真正测试你的 JCL 是否真的工作是把它扔进去并运行它,创造条件来实际测试你的代码。没有产品可以检查您在 JCL 中创建的关系(通过条件检查... CC,它又回来了)是否正确。

【讨论】:

现在我在大型机和编程方面的经验要丰富得多,我认为您的回答对这个问题最有帮助。但实际上对我有帮助(在另一个答案中几乎没有描述,但我在一次讲座中了解到,当我更改为 SDSF 时,我可以看到工作日志。那里的输出几乎可以随时通过谷歌搜索帮助解决问题:D 还是谢谢你的回答!【参考方案2】:

您不能“调试”JCL,因为 JCL 中几乎没有任何实际执行的内容 - 它主要用于启动一系列程序并定义它们各自的环境。条件代码来自执行的程序,因此要找到错误的根源:

    检查您的工作日志哪个步骤产生条件代码 8 - 这可能取决于您的 JES 版本,在我们的环境中,每个步骤都会产生一个 IEF142I-message 来显示相应的 CC。 标识此步骤中执行的程序 检查程序输出是否有任何错误消息

【讨论】:

【参考方案3】:

首先,你应该知道返回码的含义。

知道了这些,以后你可以学习如何修复JCL的错误(不是调试) 如果您通过返回码发现错误,首先,您应该检查您的语法。 作业名称的地方,添加typrun=scan,你可以检查你的语法。 如果 TYPRUN=SCAN 不返回错误信息,您可以在 SDSF 中查看作业日志。

按 S 查看详细信息。 因为JCL包含一个或多个步骤,所以必须检查哪一步出现错误。确定是哪一步,可以看到详细信息。

在命令行输入 M 到达底部。 它有很多错误区域,它显示了错误的详细信息。

【讨论】:

除了在从 NOTIFY= 生成给用户的消息中,唯一存在的 MAXCC 在 IDCAMS 中。 RC/CC 为零并不意味着该步骤“有效”,它意味着它给出了一个零。仅此而已,除非您知道具体的程序。与 4 和 8 相同,尽管在与该方案匹配的实用程序中有常规用途。从实用程序来看,只有傻瓜才会忽略四。 “未找到数据集”不会给出四的 RC/CC,它会给出 JCL 错误。您的其余答案有些混乱/令人困惑。 TYPRUN=SCAN 是个好建议。 JCL 不是一种编程语言,不管是简单的还是其他的。 感谢您的建议!【参考方案4】:

如何“调试”JCL?

JCL 并不容易。对于这个包罗万象的问题,有很多很多的消息和代码手册可供参考。本质上,您应该尽力熟悉基础知识。始终牢记操作系统的基础知识 - z/OS - 您编写 JCL 以便进行控制。

有没有办法显示错误或警告信息?

确实如此。它们遍布您的输出 - 从您的操作系统到您的程序,甚至是您自己可以为调试目的创建的消息。

当我提交我的 JOB 时,输出是 MAXCC=8。

此特定消息显然来自名为 IDCAMS 的实用程序。这实际上是一件好事,您了解这是开始故障排除的地方。随着时间的推移,你会变得更好。不必惊慌。

但是我怎样才能知道为什么或必须搜索“错误”在哪里?

基础知识。永远是基本面。由于这是 IDCAMS 意识到与 IEFBR14 一起,一旦开始,他们就永远不会失败。现在您知道了,通过永不失败,他们绝对不会显示错误消息。错误消息仅在失败时出现。因此,您只会得到返回码。 IDCAMS 的返回代码通常相当清晰。尽你所能去适应它们。

祝你好运。

【讨论】:

以上是关于如何调试 JCL的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 JCL MSGCLASS=?

如何使用jcl比较多个文件

如何通过 JCL 将参数传递给 REXX 程序

如何保护 JCL FTP 中的存储密码?

如何在 JCL 中引用最新的物理顺序 (PS) 文件

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