У меня сценарий, где мне нужно убить Java-процесс.
Вот мой сценарий:
У меня есть веб-приложение в этом веб-приложении. Я реализовал класс Listener
как 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();
}
}
}
Какое мое требование - закрыть процесс Java, когда мой tomcat завершает работу и запускает java-программу при развертывании моего веб-приложения.
Все работает нормально, чтобы запустить java-процесс при развертывании проекта.
Но я не знаю, как закрыть процесс Java, который был запущен при развертывании проекта
Любая помощь будет оценена по достоинству. Заранее спасибо.
Извините, что не ясна.. mybatch
добавляет новую java program
.
Я использовал строку ниже в моей 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.
Тогда я прочитаю этот proceesID из моего класса слушателя, и я убью taskkill/F/PID proccesID
Я знаю, что это хак. Лучше, чем это будет оценено.. Спасибо.
Это взлом для Windows. Используя два tasklist
DOS и taskkill
, вы сможете делать то, что вам нужно.
1) tasklist
// After starting the process (exec) find and record it 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);
Помните, что это взломать и будет работать только под Windows, для других ОС вам понадобятся другие команды.
сначала, если вы хотите получить информацию об отключении веб-приложения и убить ваш подпроцесс, вы должны использовать метод 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 Я нашел эту ссылку весьма полезной:
Запустить java-процесс (с использованием Runtime.exec/ProcessBuilder.start) с низким приоритетом?
"cmd.exe start maybatch"
сам запускает процесс, вы не сможете остановить его с помощью ps.destroy
. Вот почему я хотел разъяснений от ОП.
contextInitialized
только в contextInitialized
..., а уничтожение - в contextDestroyed