从java杀死linux进程并不适用于Runnable JAR

时间:2013-03-26 12:47:35

标签: java linux process terminal

在我的程序中,我启动一个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仍在运行,因为:

  • 终端仍在运行 - 当没有更多进程在其中运行时它会自行终止
  • 模拟重新启动而不重新启动nessi(但这我想要的东西)

由于我们只使用后端,您只会在终端中看到一些文字,我认为没有理由发布截图。如果有人仍然喜欢看,我可以发布截图。

我们正在使用NeSSi2进行一些网络模拟。为此,我的程序首先启动后端,然后开始模拟并等待模拟完成。当模拟完成时,程序杀死NeSSi2,重新启动它并开始另一次模拟。这个过程循环运行了好几次。

1 个答案:

答案 0 :(得分:0)

正如RotN先生所猜测的那样,问题是由于用户权限造成的。我仍然不知道为什么,但他的评论解决了我的问题 谢谢你。