5

我正在尝试从我的 java 应用程序运行 ApacheDS 实例。
我使用run()ScriptWrapper 类的这种方法来执行 ApacheDS 附带的脚本来运行它:

public class ScriptWrapper implements Serializable {
    private String scriptPath;

    protected Process run(List<String> params) throws IOException {
        LOGGER.debug("Executing script="+scriptPath);
        params.add(0, scriptPath);

        if(workDir != null) {
            return Runtime.getRuntime().exec(params.toArray(new String[params.size()]), envp.toArray(new String[envp.size()]), new File(workDir));
        } else {
            return Runtime.getRuntime().exec(params.toArray(new String[params.size()]));
        }
    }
}

但问题是,当运行此应用程序的 tomcat 被终止和/或 ScriptWrapper 被垃圾收集时,ApacheDS 的实例也会终止。如何让它活着?

编辑:谢谢你的回答。我决定以不同的方式解决这个问题,并使用带有二进制 ApacheDS 安装的脚本来守护进程。

4

4 回答 4

0

在windows中是这样的

Process p = Runtime.getRuntime().exec( "cmd /c yourCommand yourOptions");

你不需要把p.waitFor()..

于 2013-05-17T11:36:17.837 回答
0

您的主要进程应该在结束之前等待它的子进程。

对象 Process 有一个方法waitFor()。您可以创建一个新线程,然后运行并等待任何其他进程。

于 2013-05-17T10:37:44.727 回答
0

我想知道通过调用 shell 或 windows 上的命令来执行你的命令会起作用吗?

Runtime.getRuntime().exec( "/bin/bash -c yourCommand yourOptions &" ).waitFor();

Bash & (&) 是一个用于分叉进程的内置控制运算符。在 Bash 手册页中,“如果命令被控制运算符 & 终止,则 shell 在子 shell 的后台执行命令”。

我不确定 Windows 会如何工作

Runtime.getRuntime().exec( "command.exe yourCommand yourOptions" ).waitFor();
于 2013-05-17T11:04:48.463 回答
0

从技术上讲,您可以通过持有 ScriptWrapper.

您可以使用单例来保存引用。由于您的对象被主动引用,它不会被 GC 收集。

public class ScriptWrapper {
  private static ScriptWrapper uniqueInstance;

  private ScriptWrapper () {
    }

  public static synchronized ScriptWrapper getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new ScriptWrapper ();
    }
    return uniqInstance;
  }

  protected Process run(List<String> params) throws IOException {
        LOGGER.debug("Executing script="+scriptPath);
        params.add(0, scriptPath);

      if(workDir != null) {
             return Runtime.getRuntime().exec(params.toArray(new String[params.size()]), envp.toArray(new String[envp.size()]), new File(workDir));
       } else {
         return Runtime.getRuntime().exec(params.toArray(new String[params.size()]));
      }
  }

}

希望这可以帮助你!

于 2013-05-17T10:58:03.413 回答