Разрешить Java заканчиваться на main () без закрытия процессов, которые были выполнены exec ()

1

Я запускаю процесс с Runtime.getRuntime(). Exec()

Однако, как только Java достигнет конца цикла main(), java не будет закрываться, если я сначала не уничтожу() процесс.

Проблема в том, что мне нужно, чтобы процесс продолжал работать после закрытия Java.

Я очень хочу это сделать

public static void main(String args[]) {
  Runtime.getRuntime().exec("file.bat");
  // now I want java to close, and I want file.bat to keep running
}

Я попробовал System.exit(), он остановит мой цикл main(), но я думаю, что поток или что-то, что было запущено exec(), продолжает работать, не позволяя java закрываться. Я даже не могу закончить его в Eclipse без предварительного выхода из файла file.bat

Почему он не закрывается? И как мне это исправить?

Я ничего не мог найти в Интернете, и я экспериментировал некоторое время, поэтому решил попросить вас, ребята.

Спасибо, -Alex Benoit

Теги:

3 ответа

1

Догадаться. Я поделюсь своим кодом, если у кого-то еще будет тот же вопрос. Я довел его до 1 строки.

Desktop.getDesktop().open(new File("C:\\Folder\\File"));
0

Запустить файл с помощью cmd только для Windows

Старые окна, вероятно, придется использовать вместо command.com

Runtime.getRuntime().exec("cmd /c start file.bat");

Использование параметра start с параметром /wait ждет, пока битка не закончится без /wait она должна работать.

public class Command {

public static void main(String[] args) throws java.io.IOException, InterruptedException {
       String path = "C:\\DOCUME~1\\\USER\\DESKTOP";

       Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "\\test.bat");

       System.out.println("Waiting for batch file ...");
       p.waitFor();
       System.out.println("Batch file done.");
   }
}

test.bat

@echo off
cls
:start
echo This is a loop
goto start

Используйте файл command.com, чтобы получить краткое имя пути, поскольку длинные имена путей не слишком хорошо обрабатываются в start программе.

Вот пример, который я сделал ссылку для скачивания ниже: https://www.mediafire.com/?mu7vht3e6tto698

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

Process p = Runtime.getRuntime().exec("runas /profile /user:Administrator \"cmd.exe /c start test.bat\"");
  • 0
    Извините, прочитайте мой ответ на комментарий. Я только сейчас ответил. «По какой-то причине, когда вы используете cmd, он имеет тот же эффект, даже если CMD уже закрыт по окончании основного цикла, я даже пытался уничтожить его впоследствии. Ничего.: \»
  • 1
    Я проверил это прямо сейчас, и он отлично работает .. Я опубликую тестовый код.
Показать ещё 10 комментариев
0

Это вопрос, зависящий от системы. Я не уверен, что в Windows родительский процесс может завершиться перед ребенком. Я считаю, что это верно в Linux.

В качестве ориентира вы должны вызвать waitFor() для процесса. Однако в некоторых системах просто сделать это может быть недостаточно. Как указано в javadoc, поток out/err необходимо правильно очистить (используя потоки, возвращаемые getOutputStream() и getErrorStream()), потому что они могут не допустить завершения вашего процесса. Для этого я счел наиболее подходящим использовать два отдельных потока, один очистил поток ошибок, а другой - исходящий поток. Вызывающий поток (основной в вашем случае) должен сделать следующее:

  • начать внешний процесс;
  • запустите поток, чтобы очистить поток;
  • запустите поток, чтобы очистить поток err;
  • вызовите waitFor() в вызывающем потоке (main).

Я нашел вышеприведенный подход очень надежным и легким в реализации (если вы знакомы с потоками). Пожалуйста, используйте ExecutorService для потоков.

Ещё вопросы

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