当Java作为服务运行时,如何从Java启动进程

3

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

两者都

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

and

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

运行Java作为独立应用程序时能够正常工作,但是当我将Java作为服务启动时,它会出现问题。
command not found

同时还有

也有

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

command not found

我认为这是由于Windows服务引起的问题。有什么建议吗?
3个回答

1
在我的情况下,我使用了。
cmd /c <<YOUR COMMAND>>

例如:Process myProcess = Runtime.getRuntime().exec("cmd /c dir");

我还按照smurf的建议添加了环境变量。

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()的方法,可以将命令行作为单个字符串执行?


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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接