1

我正在尝试使用运行时执行从 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)
4

2 回答 2

2

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

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

另一种可能性是这些命令是所谓的“外部链接”...... UNIX 服务路径名指向 z/OS 数据集中的常规可执行文件的一种方式。如果是这种情况,那么您很可能在您的路径中有 netstat/onetstat 并且否则是正确的,但您可能没有正确的 STEPLIB 或 LNKLST 连接。当系统 exec 是目标(netstat/onetstat)时,它没有找到外部链接的程序,并且您得到“未找到”。

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

如果您有传统的 z/OS 工具,您的朋友就是控制台日志...SDSF 的日志功能或同等功能。控制台上很可能有一个 x06 异常终止和一个 CSV... 消息,这些消息将为您提供下一步该做什么的线索。

于 2015-10-14T23:46:13.210 回答
1

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

于 2016-02-16T12:33:52.550 回答