Попробуй сделать процесс, который может сам TSKILL - PullRequest
0 голосов
/ 12 сентября 2010

Итак, у меня проблема с процессом, который я запускаю, когда я пытаюсь остановить его с помощью process.destroy (), он не останавливается.

Я хочу создать файл (ProcessHandler), который расширяет Process и выполняет следующие действия:

ProcessHandler process = (ProcessHandler)Runtime.getRuntime().exec("cmd.exe /c \"java net/com/codeusa/Server 43594\"");

Итак, моя проблема - попытка преобразовать Process в ProcessHandler, где я могу переопределить команду destroy (), чтобы она сама превратилась в TSKILL. Я понял, как сделать все, но, когда я попробую описанный выше код, я получу ClassCastException ..

У всех есть идеи, как я могу сделать их совместимыми. Кстати, команда exec (String) возвращает экземпляр Process.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2010

Я понял совершенно новую вещь !!Когда я вызываю метод destroy () для процесса, он уничтожает процесс cmd.exe ... но я заменил cmd.exe на "java", и теперь, когда я вызываю destroy (), процесс java.exe завершается .. HURAY

0 голосов
/ 12 сентября 2010

Во-первых, если вы используете Java 5 или новее, я бы рекомендовал использовать ProcessBuilder вместо Runtime.getRuntime().exec().Во-первых, вам не нужно беспокоиться о цитировании аргументов.Каждый отдельный аргумент командной строки является отдельным параметром.Например:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", "java net/com/codeusa/Server 43594");
Process process = builder.start();

При запуске процесса с использованием ProcessBuilder или Runtime.getRuntime().exec() JVM целиком и полностью создает и возвращает подкласс Process по своему выбору, и нет способа повлиять на его решение.Я предполагаю, что ваш класс ProcessHandler - это тот, который вы написали сами (я не могу найти класс Java API с таким именем).Он может быть подклассом Process, но даже если это не так, JVM не может вернуть его экземпляр, когда вы используете ProcessBuilder или Runtime.getRuntime().exec().Таким образом, приведенная выше строка кода гарантирует исключение ClassCastException, при условии, что оно не вызывает каких-либо других исключений.

В прошлом у меня был некоторый опыт процессов, которые не реагировали на методы destroy().Обычно это происходило из-за того, что стандартный вывод или стандартная ошибка, записываемая процессом, не читались, и процесс остановился из-за того, что один или несколько его буферов ввода / вывода были заполнены.Записывает ли процесс выше что-либо в свой стандартный вывод или стандартную ошибку, и если да, вы читаете это?

Считать как стандартный вывод, так и стандартные потоки ошибок проще с ProcessBuilder: если вы добавите строку builder.redirectErrorStream(true); между двумя вышеупомянутыми строками, вам нужно только читать из стандартного вывода процесса.Если вы застряли на Java 1.4 или более ранней версии и Runtime.getRuntime().exec(), вам придется настроить два разных объекта в двух разных потоках, по одному для чтения из каждого потока.

Я не уверен, что выпытаетесь достичь с помощью класса ProcessHandler - вы не предоставили исходный код для него.Кроме того, у меня никогда не было необходимости убивать процесс более принудительно, чем с помощью метода destroy().

...