使用Java按顺序运行命令行命令

使用Java按顺序运行命令行命令,java,command-line,process,executable,minecraft,Java,Command Line,Process,Executable,Minecraft,我正在编写一个程序,需要能够通过命令提示符打开和终止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

我正在编写一个程序,需要能够通过命令提示符打开和终止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);

这只是我为它准备的基本逻辑代码。我尝试过使用BufferedWriter,但它们不起作用,甚至通过执行cd命令也会出错。我正在使用Minecraft_Server.exe,它位于Minecraft.net/download.jsp。“stop”命令在进程处于活动状态时运行,并告诉程序保存服务器,然后终止。我是否需要以某种方式使用线程。请帮助:)我已经花了几个小时试图找到答案,我只是不知道lol。

您可能想看看ProcessBuilder(),在那里您可以指定工作目录,该目录将用于以后要执行的所有命令。

您可能想看看ProcessBuilder()您可以在其中指定要在之后执行的所有命令所使用的工作目录。

每个命令都作为单独的进程运行

您的“cd./Server”对您执行的命令没有影响

你有叫stop的命令行程序吗

我会写

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

我不会调用System.exit(0)

每个命令都作为单独的进程运行

您的“cd./Server”对您执行的命令没有影响

你有叫stop的命令行程序吗

我会写

Thread.sleep(30 * 1000); // 30 Seconds.
我不会调用System.exit(0)

我认为您的“cd./Server”命令将丢失这里的上下文,因为对exec的下一次调用不会得到第一次调用的结果。换句话说,对exec的每个调用都完全独立于对exec的其他调用

尝试将其中的一些放在shell脚本中,然后简单地执行脚本。如果您仍然通过命令行控制服务器,那么这并不比您已经尝试过的更复杂。

您的“cd./server”命令,我认为将丢失这里的上下文,因为对exec的下一次调用不会得到第一次调用的结果。换句话说,对exec的每个调用都完全独立于对exec的其他调用


尝试将其中的一些放在shell脚本中,然后简单地执行脚本。如果您仍然通过命令行控制服务器,那么这并不比您已经尝试过的更复杂。

要在特定目录下运行命令,请使用特殊版本的exec

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

其中,
dir
是进程运行的dir

命令,特别是dir使用特殊版本的exec

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

如果
dir
正在为进程使用dir

请尝试将命令放入字符串数组中:

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

此外,停止也将不起任何作用,因为您没有引用要停止的内容。

尝试将命令放入字符串数组:

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

此外,停止也将不起任何作用,因为您没有参考要停止的内容。

这将不起作用。这两个命令仍将作为单独的进程执行。这将不起作用。这两个命令仍将作为单独的进程执行。