5

Java アプリケーションから ApacheDS インスタンスを実行しようとしています。
ScriptWrapper クラスのこのようなメソッドを使用run()して、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

メイン プロセスは、終了する前にその子プロセスを待機する必要があります。

オブジェクト Process にはメソッドがありwaitFor()ます。新しいスレッドを作成して実行し、他のプロセスを待つことができます。

于 2013-05-17T10:37:44.727 に答える
0

Windowsでシェルまたはコマンドを呼び出してコマンドを実行することで、それが機能するのだろうか?

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

Bash の & (アンパサンド) は、プロセスを fork するために使用される組み込みの制御演算子です。Bash の man ページから、「コマンドが制御演算子 & によって終了された場合、シェルはサブシェルのバックグラウンドでコマンドを実行します」。

Windowsがどのように機能するかわかりません たぶん試してみてください

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