3

我有一个使用 prcorun ( http://commons.apache.org/proper/commons-daemon/ ) 作为 Windows 服务器运行的 java 进程;不幸的是,我必须启动一个用 C/C++ 编写的外部遗留命令。

两个都

Process myProcess = Runtime.getRuntime().exec(command);

Process myProcess = new ProcessBuilder(command, arg).start();

当 java 作为独立应用程序启动时运行良好,但是当我将 java 作为服务启动时它会回复

command not found

也与

Process myProcess = Runtime.getRuntime().exec("dir");

command not found

我认为是由于Windows服务的问题。

有什么建议吗?

4

3 回答 3

1

我会尝试进行快速测试并在您的服务中打印 PATH 环境变量。当您将某些命令作为服务运行时,我通常会发现,PATH 可能并不完全可用(这也可以解释为什么 DIR 不适合您)。如果是这种情况,在启动服务时,您必须确保 PATH 包含正常 bin 和旧 bin。

于 2015-11-10T20:31:49.550 回答
1

在我的情况下,我使用

cmd /c <<YOUR COMMAND>>

例如。进程 myProcess = Runtime.getRuntime().exec("cmd /c dir");

我还添加了环境。正如蓝精灵所建议的

private static String[] getEnv() {
    Map<String, String> env = System.getenv();
    String[] envp = new String[env.size()];
    int i = 0;
    for (Map.Entry<String, String> e : env.entrySet()) {
        envp[i++] = e.getKey() + "=" + e.getValue();
    }
    return envp;
}

...

Process myProcess = Runtime.getRuntime().exec("cmd /c dir",getEnv());

可以将命令行作为单个字符串执行的 java.lang.Runtime.exec() 的替代方案?

于 2015-11-11T11:24:05.830 回答
1

正如错误所说,在路径中找不到该命令。您需要将环境变量 PATH 设置为子进程的环境。查看 exec(cmd, String[] env) 方法。您可以创建一个环境变量数组(键值对)并将其传递给 exec()。

于 2015-11-10T20:40:52.903 回答