0

私のプログラムでは、gnome-terminalを起動し、その中でプログラムを実行します。そのプログラムがシミュレーションの実行を終了したら、プロセスを強制終了して再起動します。シミュレーションが停止した後でも、すべてのリソースが解放されるわけではないため、これを強制終了することが重要です(これにより、HeapSpaceErrorが発生する可能性が高くなります)。

プロセスを開始する方法は次のようになります。

private void startNeSSiAndWait(int i) {

    System.out.println("OS is " + os);
    // if some unix system - we assume there is a gnome-terminal
    if(os.contains("nix") || os.contains("nux") || os.contains("aix")){

        String[] cmds = {"gnome-terminal", "-x" ,"bash", "-c", "cd '" + nessiPath + "'; export JAVA_HOME="+javaHome +"; ./nessi2.sh"};
        try {
            nessiProcess = Runtime.getRuntime().exec(cmds); // nessiProcess is an instance of Process

            Thread.sleep(5000); // wait till programm is ready
        } catch (IOException ex) {
            System.err.println("Error in executing proces..");
            ex.printStackTrace();

        }catch(InterruptedException ex){
            System.err.println("Error in sleeping..");
            ex.printStackTrace();
        }

    }else if(os.contains("win")){
       ...
    }

}

プロセスを強制終了する方法は次のとおりです。

private void killNeSSiAndWait(){

    nessiProcess.destroy();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException ex) {
        System.err.println("Error in sleeping..");
        ex.printStackTrace();
    }
    System.out.println("destroyed");
}

これらのメソッドは、NetBeansから開始する限り正常に機能します。ただし、Runnable JARとしてエクスポートするとすぐに、プロセスを強制終了しても機能しません。

私はそれをJava6を搭載したUbuntu12.1032ビットマシンで実行しています。

Runnable JARとして機能しない理由は何でしょうか?

編集
出力としてのエラーはありません。ターミナルはnessi2.shの実行を継続し、を無視しnessiProcess.destroy()ます。

NeSSi2は、DAI-Laboratoriesで開発されたシミュレーターです。詳細については、こちらを参照してください。バックエンドのみを使用しています。nessi-backendの唯一の目に見える出力は、ターミナル経由です。
nessiがまだ実行されていることを知っています。理由は次のとおりです。

  • ターミナルはまだ実行中です-実行中のプロセスがなくなると、ターミナルは自殺します
  • シミュレーションはnessiを再起動せずに再起動します(しかし、これは私が望むものではありません)

バックエンドのみを使用しており、端末には一部のテキストしか表示されないため、スクリーンショットを投稿する理由はないと思います。それでも誰かがそれを見るのが好きなら、私はスクリーンショットを投稿することができます。

NeSSi2を使用して、いくつかのネットワークシミュレーションを行っています。このために、私のプログラムは最初にバックエンドを開始し、次にシミュレーションを開始し、シミュレーションが終了するまで待機します。シミュレーションが終了すると、プログラムはNeSSi2を強制終了し、再起動して別のシミュレーションを開始します。この手順は、ループで数回実行されます。

4

1 に答える 1

0

RotN卿が推測したように、問題はユーザーの特権によるものでした。理由はまだわかりませんが、彼のコメントで問題は解決しました。
それをありがとう。

于 2014-01-07T16:29:18.710 に答える