Использование Java для запуска команд командной строки в порядке - PullRequest
0 голосов
/ 15 июня 2011

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

Runtime.getRuntime().exec("cd ./Server"); //go to the server directory
Process server = Runtime.getRuntime().exec("java -Xmx1024M -Xms1024M -jar minecraft_server.exe nogui"); //run minecraft server in nogui mode
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
Runtime.getRuntime().exec("stop"); //terminate the server
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
server.destroy(); //forcibly terminate the server assuming it hasn't already
System.exit(0);

Это просто базовый логический код, который я придумал. Я пытался использовать BufferedWriters, но они просто не работают, и он получает ошибку даже при выполнении команды cd. Я использую Minecraft_Server.exe, который находится по адресу minecraft.net/download.jsp. Команда «stop» выполняется, пока процесс активен, и сообщает программе сохранить сервер, а затем завершить работу. Нужно ли использовать потоки каким-то образом? Пожалуйста, помогите :) Я потратил несколько часов, пытаясь найти ответ, и я просто не знаю, смеется.

Ответы [ 5 ]

3 голосов
/ 15 июня 2011

Ваша команда "cd ./Server", я думаю, потеряет здесь контекст, потому что следующий вызов exec не получит результаты первого вызова.Другими словами, каждый вызов exec полностью независим от других вызовов exec.

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

1 голос
/ 15 июня 2011

Для запуска команды, в частности, dir используйте специальную версию exec

public Process exec(String command, String[] envp, File dir)

где dir рабочая директория для процесса

1 голос
/ 15 июня 2011

Каждая команда запускается как отдельный процесс.

Ваш "cd ./Server" не влияет на команды, которые вы запускаете после.

У вас есть программа командной строки с именем stop?

Я бы написал

Thread.sleep(30 * 1000); // 30 Seconds.

и не вызвал бы System.exit (0);

1 голос
/ 15 июня 2011

Возможно, вы захотите взглянуть на ProcessBuilder ( здесь ), где вы можете указать рабочий каталог, который будет использоваться для всех команд, которые вы хотите выполнить после.

0 голосов
/ 15 июня 2011

Попробуйте поместить команды в строковый массив:

String[] cmd = { "cd","./Server" };

и String[] cmd2 = {"java", "-Xmx1024M", "-Xms1024M", "-jar", "minecraft_server.exe", "nogui"}

Тогда попробуйте

Runtime.getRuntime().exec(cmd); //go to the server directory
Process server = Runtime.getRuntime().exec(cmd2); //run minecraft server in nogui mode
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
Runtime.getRuntime().exec("stop"); //terminate the server
Thread.sleep((long)(1000*60*.5)); //wait 30 seconds
server.destroy(); //forcibly terminate the server assuming it hasn't already
System.exit(0);

Также остановка ничего не сделает, так как вы не указываете, что останавливать.

...