Я запускаю процесс с 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
Догадаться. Я поделюсь своим кодом, если у кого-то еще будет тот же вопрос. Я довел его до 1 строки.
Desktop.getDesktop().open(new File("C:\\Folder\\File"));
Запустить файл с помощью 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\"");
Это вопрос, зависящий от системы. Я не уверен, что в Windows родительский процесс может завершиться перед ребенком. Я считаю, что это верно в Linux.
В качестве ориентира вы должны вызвать waitFor()
для процесса. Однако в некоторых системах просто сделать это может быть недостаточно. Как указано в javadoc, поток out/err необходимо правильно очистить (используя потоки, возвращаемые getOutputStream()
и getErrorStream()
), потому что они могут не допустить завершения вашего процесса. Для этого я счел наиболее подходящим использовать два отдельных потока, один очистил поток ошибок, а другой - исходящий поток. Вызывающий поток (основной в вашем случае) должен сделать следующее:
waitFor()
в вызывающем потоке (main). Я нашел вышеприведенный подход очень надежным и легким в реализации (если вы знакомы с потоками). Пожалуйста, используйте ExecutorService
для потоков.