【问题标题】:Odd behaviour of Runtime.getRuntime().exec()Runtime.getRuntime().exec() 的奇怪行为
【发布时间】:2011-07-31 20:09:00
【问题描述】:

我有一些 Java 代码在 Windows 机器上执行某个命令。但是,它的行为很奇怪,因为相同的命令在一台机器上工作,但在另外三台机器上却失败了。据我所知,四台机器都是相同的。

命令是这样的:

cmd /c %APP_HOME%\..\..\some\more\path\executable -arg1=value1 -arg2=value2 -errorlogname=%APP_HOME%\logs\errors.log -arg3 some more parameters

其中%APP_HOME% 是设置为值“D:/path/to/program”的系统变量。

我得到的错误是这样的:

有关无法打开其中一个日志或“相关文件”的应用程序特定错误消息: d:/路径/到/程序\日志。 errno = 13,权限被拒绝

我使用的 Java 是这样的:

Runtime.getRuntime().exec(cmdStr);

其中cmdStr 是一个包含上述命令的字符串。现在,我知道的事情是;

  1. 我真的应该使用重载的 Runtime.exec(String[]) 方法
  2. 该命令混合使用正斜杠和反斜杠

这些是有效的 cmets,我可能最终会解决问题,但我要解决的是为什么完全相同的代码在 4 台机器中只有 3 台失败。

是的,命令中提到的所有路径都存在于盒子上。

而且它变得更加奇怪。如果我执行以下(非常相似的)命令,它在所有四个盒子上都可以正常工作。

cmd /c %APP_HOME%\..\..\some\more\path\executable -arg1=value1 -arg2=value2 -errorlogname=D:\path\to\program\logs\errors.log -arg3 some more parameters

在上述工作版本中,唯一的区别是 %APP_HOME% 引用已替换为 -errorlogname 参数的绝对路径。但是变量已经指向可执行文件的位置。

现在,相同的代码在一个盒子上运行良好这一事实让我怀疑问题不在于 Java 代码。同样,斜线方向的混合我认为没有问题,因为这种混合物在一台机器上工作。

在我看来,它应该在每台机器上都失败。不只是其中之一。

显然,如果一切都完全相同,它会在每台机器上损坏(或工作)。但是我想看的所有东西都是相同的。

其他人可以提出其他要考虑的建议吗?

非常感谢。

【问题讨论】:

  • 每个盒子上 %APP_HOME% 的值是多少?您是否确信每台机器上都安装了相同版本的可执行文件,并且具有相同的用户设置和文件权限?
  • 你在所有机器上的命令shell中都试过这个命令吗,如果能重现问题肯定不是java问题...

标签: java windows process command runtime.exec


【解决方案1】:

我怀疑 %APP_HOME% 实际上没有在故障机器上设置,但您碰巧在正确的目录中启动脚本,以使可执行文件的相对路径正常工作。要进一步调试它,您必须通过打印出来实际验证 %APP_HOME% 的值是否正确。

【讨论】:

  • 这是一种可能性,我必须进行测试。我怀疑 %APP_HOME% 是相同的,因为 Java 代码是由脚本启动的(在所有框中都相同)。但我会检查一下。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2018-02-13
  • 1970-01-01
  • 2011-01-09
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多