Как убить процессы в Java, не форсируя это? - PullRequest
3 голосов
/ 25 августа 2009

У меня есть Java-программа, которая запускает ряд других программ. Как только пользователь закончил, у него есть кнопка, чтобы убить все процессы, это должно убить все, что работает, но оно должно сделать это с помощью их принудительного вызова. По крайней мере, один из этих других процессов также написан на Java и имеет несколько перехватчиков завершения работы, поскольку он автоматически сохраняет файл настроек при выходе и уничтожает запущенные им процессы, например.

    Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        if (process != null)
            process.destroy();
      }
    }

Когда вызовы основного процесса уничтожают, вышеуказанный код не запускается в подпроцессе. В любом случае я могу прервать процессы, чтобы они продолжались?

Я портирую с Perl, который делает это, будет kill (9, @ kill_process);

Спасибо.

Ответы [ 2 ]

6 голосов
/ 25 августа 2009

Сигнал Kill 9 (SIGKILL) сообщает операционной системе, чтобы завершить процесс. Процесс заранее не получает уведомления о том, что это произойдет, и не может выполнить очистку из-за этого.

process.destroy () является эквивалентом kill(9,@kill_process); в Perl, и ваш старый процесс тоже не выполнял бы очистку.

Сигнал убийства 15 (SIGTERM) сообщит процессу, чтобы убить себя.

2 голосов
/ 25 августа 2009

Существует несколько способов взаимодействия с приложением. Одним из наиболее распространенных является отправка сигнала. Команда для сигнала называется kill. Код Perl, который вы публикуете, использует этот подход.

Вы можете отправлять различные сигналы, некоторые из них обрабатываются приложением, некоторые из них обрабатываются ОС. Сигнал по умолчанию - HUP. Он сообщает приложению, что «соединение с пользователем» было прервано (это фактически означает, что модем завис), и он должен выйти Приложение с хорошим поведением выйдет.

Если вы отправите сигнал 9 (это то, что делает ваш Perl-код), ОС прекратит работу приложения без вопросов.

Другим подходом является связь с приложением по умолчанию. Таким образом, вы можете отправить «Ctrl + c» или «Alt + f4» (это команды, обычно заканчивающиеся в приложении) на STDIN процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...