我有场景,我需要杀死一个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
。
答案 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命令tasklist
和taskkill
,您应该能够做到所需。
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
我知道这是一个黑客。比这更好的赞赏..谢谢。