私のプログラムでは、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を強制終了し、再起動して別のシミュレーションを開始します。この手順は、ループで数回実行されます。