我目前正在开发一个插件,该插件也可以在Linux Shell中执行命令。我设置了一些以后需要的命令。杀死屏幕已经可以了,但是现在我想通过插件启动一些屏幕。但这不起作用。
我试图从Runtime.getRuntime.exec(cmd);
更改为用于杀死屏幕的ProcessBuilder。
我执行命令的方法
public static void shellExecuteBuilder(String[] command, Player p, boolean bool, String Wrapper) {
ProcessBuilder prb;
try {
prb = new ProcessBuilder(command);
prb.redirectErrorStream(true);
Process pro = prb.start();
BufferedReader r = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String line;
while (prb.redirectErrorStream() == true) {
line = r.readLine();
if (line != null) {
System.out.println(line);
}
}
if (bool == true) {
p.sendMessage("§aDer Wrapper §e" + Wrapper + " §awurde angehalten!");
} else {
p.sendMessage("§aDer Wrapper §e" + Wrapper + " §awurde gestartet!");
}
} catch (IOException e) {
if (bool == true) {
p.sendMessage("§cDer Wrapper §e" + Wrapper + " §ckonnte nicht angehalten werden!");
} else {
p.sendMessage("§cDer Wrapper §e" + Wrapper + " §ckonnte nicht gestartet werden!");
}
e.printStackTrace();
}
}
我如何通过另一种方法设置
String[] command = new String[] {"/bin/sh", "-c", "cd /path/to/my/script/", "./start.sh"};
shellExecuteBuilder(command, p, false, Wrapper);
我希望我的方法将启动一个新屏幕,但实际上什么也没做。
答案 0 :(得分:1)
/bin/sh
可以接受一系列命令,但是格式与您所拥有的不同。尝试以下方法:
String[] command = new String[] {"/bin/sh", "-c", "cd /path/to/my/script/; ./start.sh"};
此外,处理过程输出的方式永远不会结束。 while
循环应该正在测试流程返回的输出,而不是重定向设置(它永远不会改变)。这是修改后的版本,可以正确读取输出并等待子shell退出。请注意,我删除了一些应用程序变量(bool
,Wrapper
,Player
)以简化示例:
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
public class TestPB {
public static void shellExecuteBuilder(String[] command) {
ProcessBuilder prb;
try {
prb = new ProcessBuilder(command);
prb.redirectErrorStream(true);
Process pro = prb.start();
BufferedReader r = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String line;
while( (line = r.readLine()) != null) {
System.out.println(line);
}
pro.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
public static final void main(String[] args) {
TestPB tpb = new TestPB();
String[] command = new String[] {"/bin/sh", "-c", "cd /path/to/my/script/; ./start.sh"};
TestPB.shellExecuteBuilder(command);
}
}
答案 1 :(得分:0)
或者,不用告诉外壳程序更改目录ProcessBuilder
可以做到这一点,尽管这与当前使程序“分解”的方式不同:
ProcessBuilder prb = new ProcessBuilder ("/bin/sh", "-c", "./startsh");
prb.directory("/path/to/my/script");
prb.redirectErrorStream(true);
Process pro = prb.start();
或在一条语句中全部使用“流利”风格:
Process pro = new ProcessBuilder ("/bin/sh", "-c", "./startsh")
.directory("/path/to/my/script").redirectErrorStream(true).start();