【问题标题】:start process from java when java run as service当java作为服务运行时从java启动进程
【发布时间】:2015-11-10 20:24:33
【问题描述】:

我有一个使用 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服务的问题。

有什么建议吗?

【问题讨论】:

    标签: java c++ windows procrun


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在我的情况下,我使用了

        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());
        

        Alternative to java.lang.Runtime.exec() that can execute command lines as a single string?

        【讨论】:

          猜你喜欢
          • 2013-06-08
          • 1970-01-01
          • 1970-01-01
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 2019-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多