我想在Linux Shell中通过Java执行一个命令的问题

时间:2019-04-02 13:12:26

标签: java linux

我目前正在开发一个插件,该插件也可以在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);

我希望我的方法将启动一个新屏幕,但实际上什么也没做。

2 个答案:

答案 0 :(得分:1)

/bin/sh可以接受一系列命令,但是格式与您所拥有的不同。尝试以下方法:

String[] command = new String[] {"/bin/sh", "-c", "cd /path/to/my/script/; ./start.sh"};

此外,处理过程输出的方式永远不会结束。 while循环应该正在测试流程返回的输出,而不是重定向设置(它永远不会改变)。这是修改后的版本,可以正确读取输出并等待子shell退出。请注意,我删除了一些应用程序变量(boolWrapperPlayer)以简化示例:

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