2011-06-15 142 views
0

我正在編寫一個程序,需要能夠通過命令提示符打開並終止一個Minecraft服務器。我有它的代碼到目前爲止是這樣的:使用Java按順序運行命令行命令

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.net/download.jsp上的Minecraft_Server.exe。 「stop」命令在進程處於活動狀態時運行,並通知程序保存服務器,然後終止。我是否需要以某種方式使用線程。請幫助:)我已經放了好幾個小時試圖找到答案,我只是無能爲力。

回答

1

您可能想看看ProcessBuilder(here),您可以在其中指定將用於所有要執行的命令的工作目錄。

1

每個命令都作爲一個單獨的進程運行。

您的「cd ./Server」對您之後運行的命令沒有影響。

你有一個叫做stop的命令行程序嗎?

我會寫

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

,我也不會調用System.exit(0);

3

您的「cd ./Server」命令,我認爲會在這裏丟失上下文,因爲下一次調用exec並不會獲得第一個調用的結果。換句話說,對exec的每次調用都完全獨立於對exec的其他調用。

嘗試將其中的一些內容放在shell腳本中,並簡單地執行該腳本。如果你通過命令行來控制服務器,那麼這並不比你已經嘗試過的更復雜。

1

要運行特別dir命令使用EXEC的特殊版本

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

其中dir針對過程

0

嘗試把命令中的字符串數組工作目錄:

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); 

同時停止不會做任何事情,因爲你沒有參考什麼停止。

+0

這是行不通的。這兩個命令仍將作爲單獨的進程執行。 – 2011-06-15 14:50:29