Как убить Java-программу с помощью Java-программы

1

У меня сценарий, где мне нужно убить 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.

  • 0
    Чтобы быть понятным, Maybatch это командный файл, который сам запускает процесс Java?
  • 0
    Похоже, ваш contextInitialized и contextDestroyed смешаны.
Показать ещё 1 комментарий
Теги:
tomcat

3 ответа

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.

Тогда я прочитаю этот proceesID из моего класса слушателя, и я убью taskkill/F/PID proccesID

Я знаю, что это хак. Лучше, чем это будет оценено.. Спасибо.

1

Это взлом для 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, для других ОС вам понадобятся другие команды.

  • 0
    Спасибо за ваш ответ. Я совершил такой же взлом, но другим способом. Я опубликовал это как ответ. Есть ли что-нибудь лучше, чем это? потому что это своего рода работа только для окон ..
  • 0
    Я немного искал, но также не мог найти лучшего решения. Если вам нужно поддерживать несколько ОС, то вам нужно будет создать похожий код для каждой отдельной ОС - это раздражает, но не невозможно.
1

сначала, если вы хотите получить информацию об отключении веб-приложения и убить ваш подпроцесс, вы должны использовать метод 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) с низким приоритетом?

  • 1
    Плюс один, но учтите, что если "cmd.exe start maybatch" сам запускает процесс, вы не сможете остановить его с помощью ps.destroy . Вот почему я хотел разъяснений от ОП.
  • 0
    Извините за редактирование моего плохого вопроса ... Я имел в виду, что я буду contextInitialized только в contextInitialized ..., а уничтожение - в contextDestroyed

Ещё вопросы

Сообщество Overcoder
Наверх
Меню