JAVA runtime exec 在大型机 USS 环境中为 netstat 命令抛出 IOException

JAVA runtime exec throwing IOException for netstat command in mainframe USS environment

我正在尝试使用运行时执行从 java 执行 netstat 命令,但它抛出了以下 IOException。

它对其他命令工作正常,即使是同义词命令 onetstat 也工作正常。我试图理解为什么 netstat 单独失败以及如何使其工作。感谢您的帮助。

java.io.IOException: Cannot run program "netstat": netstat: not found
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1059)
    at java.lang.Runtime.exec(Runtime.java:629)
    at java.lang.Runtime.exec(Runtime.java:462)
    at java.lang.Runtime.exec(Runtime.java:359)
    at com.ca.RunCmd.executeCommand(RunCmd.java:30)
    at com.ca.RunCmd.main(RunCmd.java:18)
Caused by: java.io.IOException: netstat: not found
    at java.lang.UNIXProcess.fullPath(UNIXProcess.java:306)

要真正了解这里发生了什么,您需要查找实际的可执行文件,无论是 netstat 还是 onetstat。

如果 netstat 在 shell 中是 onetstat 的别名 - 根据您正在 运行 哪个 shell,"whence" 或 "alias" 命令会告诉你。一个简单的解决方案可能是通过 shell(/bin/sh -c netstat)而不是直接 运行ning netstat 命令来 运行 命令。

另一种可能性是这些命令是所谓的 "external link"...一种 UNIX 服务路径名指向 z/OS 数据集中常规可执行文件的方法。如果是这种情况,那么您的路径中很可能有 netstat/onetstat 并且在其他方​​面是正确的,但您可能没有正确的 STEPLIB 或 LNKLST 串联。当系统exec的目标(netstat/onetstat)时,它没有找到外部链接程序,你得到"not found".

这里可能会出现各种问题,尤其是涉及到外部链接时。可能存在系统 (APF) 授权问题、STEPLIB/LNKLST 中缺少模块、没有足够的内存来加载程序等等。不幸的是,z/OS 上的 UNIX 服务并不总是解释所有可能的故障代码,所以有时候去打猎是很有必要的。一个好的开始是捕获您遇到的异常并查找 ERRNO/ERRNO2 值 - 它们可以给您一个很好的提示。

如果您有传统的 z/OS 设施,您的朋友就是控制台日志...SDSF 的日志功能或等效功能。控制台上很可能会出现 x06 异常终止和 CSV... 消息,为您提供下一步操作的线索。

解决方案是使用实际命令而不是别名命令,在这种情况下实际命令是onetstat,netstat 是别名命令。 问题出在别名命令上,当您尝试通过 java 运行时执行别名命令时,它无法执行它们。我还没有找到确切的原因,但可以通过为尝试执行它们的任何命令创建别名来轻松复制问题,您也可以在 windows 环境中尝试此操作。