如何使用java程序杀死java程序

时间:2014-11-27 07:53:00

标签: java tomcat

我有场景,我需要杀死一个java进程。

以下是我的情景:

我在该Web应用程序中有Web应用程序我已经实现了Listener类,如下所示

   public class MyListener extends ServletContextListener {        
    java.lang.Process ps  = null;

public void contextInitialized(ServletContextEvent arg0) {
   // This will be excuted when my web application executed
       String command= "cmd.exe start maybatch";// This command is to execute a batch program that triggers java program   
      ps =  Runtime.getRunTime().exec(command);
}

public void contextDestroyed(ServletContextEvent arg0) {
    //This part will be executed when server shutdown happens.
    // Here I want to close the java process which was triggered when project deployed.
    if( ps !=null)
        ps.destroy();
    }  
}

}

我的要求是在我的tomcat关闭时关闭Java进程并在部署Web应用程序时启动java程序。

在部署Project时,一切正常,直到启动java进程。

但我不知道如何关闭部署项目时触发的 java进程

任何帮助将不胜感激。 提前谢谢。

很抱歉不清楚.. mybatch为新java program

添加了一个地方

3 个答案:

答案 0 :(得分:1)

首先,如果您想了解Web应用程序的关闭并终止您的子流程,则应在代码段中使用 contextDestroyed()方法而不是 contextInitialized()。 所以基本上你需要交换方法的内容。

public class MyListener extends ServletContextListener {        
  java.lang.Process ps  = null;

    public void contextInitialized(ServletContextEvent arg0) {
       // This will be excuted when my web application executed
           String command= "cmd.exe start maybatch";// This command is to execute a batch program that triggers java program   
          ps =  Runtime.getRunTime().exec(command);
    }

    public void contextDestroyed(ServletContextEvent arg0) {
        //This part will be executed when server shutdown happens.
        // Here I want to close the java process which was triggered when project deployed.
        if( ps !=null)
            ps.destroy();
        }  
    }
  }

<强> UPD

您是否可以避免使用批处理文件? 如果是,您将能够关闭衍生的java应用程序。 PS我发现这个链接非常有用:

Start a java process (using Runtime.exec / ProcessBuilder.start) with low priority?

答案 1 :(得分:1)

这是适用于Windows的 hack 。使用两个DOS命令tasklisttaskkill,您应该能够做到所需。

1)tasklist

// After starting the process (exec) find and record it's process ID
Process psGetId = Runtime.getRuntime().exec("cmd.exe start tasklist /V /FO \"CSV\" /FI \"IMAGENAME eq cmd.exe*\"");
InputSteam is = psGetId.getInputStream();
// now parse the incoming stream searching for the PID that you need

尝试如上所述手动运行tasklist命令以查看其返回的内容,然后您就会知道对InputStream

的期望

2)taskkill

// Assuming you have found and saved the process ID from above, the following can be used to kill it
Process psKillId = Runtime.getRuntime().exec("cmd.exe start taskkill /F /PID " + savedProcessId);

请记住,这是 hack ,只能在Windows下使用,对于其他操作系统,您需要使用其他命令。

答案 2 :(得分:0)

我在我的java程序中使用了以下行,该行将由mybatch

触发
  String processName =
          java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
    Strnig proccessId =  processName.split("@")[0];
  // Now I have saved this in a file and file will be saved somewhere available to my listner class.

然后我将从我的听众课程中读取这个过程ID,我将杀死taskkill /F /PID proccesID

我知道这是一个黑客。比这更好的赞赏..谢谢。