在我的程序中,我启动一个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,就不会终止该进程。
我在使用Java 6的Ubuntu 12.10 32Bit计算机上运行它。
它不能作为Runnable JAR工作的原因是什么?
修改:
输出没有错误。终端只是继续执行nessi2.sh并忽略nessiProcess.destroy()
。
NeSSi2是DAI-Laboratories开发的模拟器,有关详细信息,请参阅here。我们只使用后端。 nessi-backend唯一可见的输出是通过终端 我知道nessi仍在运行,因为:
由于我们只使用后端,您只会在终端中看到一些文字,我认为没有理由发布截图。如果有人仍然喜欢看,我可以发布截图。
我们正在使用NeSSi2进行一些网络模拟。为此,我的程序首先启动后端,然后开始模拟并等待模拟完成。当模拟完成时,程序杀死NeSSi2,重新启动它并开始另一次模拟。这个过程循环运行了好几次。
答案 0 :(得分:0)
正如RotN先生所猜测的那样,问题是由于用户权限造成的。我仍然不知道为什么,但他的评论解决了我的问题 谢谢你。