Как я могу завершить процесс, запущенный из задачи Ant, если сценарий отменен? - PullRequest
1 голос
/ 17 апреля 2009

Я создал задачу Ant для компиляции приложений VB6.

После некоторой предварительной обработки исходных файлов я запускаю VB6.exe с соответствующими параметрами, используя

Process p = Runtime.getRuntime().exec(...);
p.waitFor();

Но когда я нажимаю Ctrl + C во время работы Ant, сценарий и моя задача завершаются, но порожденный процесс все еще выполняется.

Как я могу автоматически завершить процесс, который я начал, когда сценарий Ant завершается? Что именно произойдет, если я нажму Ctrl + C? Моя задача убита немедленно или есть какой-то способ реагировать?

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

Вас может заинтересовать этот код:

    final Process process = new ProcessBuilder("blah blah").start();
    Runtime.getRuntime().addShutdownHook(new Thread() {

        @Override
        public void run() {
            process.destroy();
        }

    });
    process.waitFor();

Javadoc для addShutdownHook :

Виртуальная машина Java отключается в ответ на два вида событий:

  • Программа завершается нормально, когда выходит последний поток, не являющийся демоном, или при выходе (эквивалентно, System.exit) метод вызывается, или
  • Виртуальная машина завершает работу в ответ на пользовательское прерывание, например, набрав ^ C,
    или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.
1 голос
/ 17 апреля 2009

Runtime.exec() запускает команду в отдельном процессе ОС. Когда вы нажимаете Ctrl + C, вы убиваете процесс Java.

Вы можете попробовать Runtime.addShutdownHook(Thread hook). Эта цепочка будет вызываться, когда JVM завершает работу, когда вы нажимаете Ctrl + C. Реализуйте поток ловушек, который будет пытаться завершить процесс, который вы начали. Чтобы завершить процесс, вам нужно найти команду в этой ОС и использовать ее в Runtime.exec().

...