使用java执行复杂的流程命令行

时间:2017-05-26 12:04:18

标签: java linux command-line process

我尝试使用 ProcessBuilder 从java类执行命令行进程 成功的执行实际上在我的日食中打开了另一个终端 *就像:*
过程---->打开---->子过程
其余的所有命令都必须在子流程中执行

有人帮助我了解如何触发子流程并完成退出后。

2*A_mat


NB:

  

给定命令只是一个例子,问题与'jdbc'无关,它与过程有关。子进程。

3 个答案:

答案 0 :(得分:1)

您误解了如何调用操作系统进程。

每个进程都包含程序名称(如notepad.exejava.exe),以及零个或多个命令行参数。

ProcessBuilder一次能够运行一个命令。构成其命令的字符串列表不是单独的命令;它们代表程序名称及其各个命令行参数。

因此,要运行mysql,您需要分离命令行参数:

ProcessBuilder pb = new ProcessBuilder("mysql", "-u", "root", "-p", password);

您的下一行select * from employee;不是系统命令,也不是子进程。这是一个mysql命令 - 仅由mysql理解的指令。您可以将它写入mysql进程的标准输入,因为mysql碰巧通过标准输入接受命令:

try (Writer writer = new OutputStreamWriter(process.getOutputStream())) {
    write.write("select * from employee;");
}

然而,并非所有程序都通过标准输入接受命令。

您似乎意识到,mysql不适合外部进程。阅读和解析输出将比初看起来更困难。 JDBC将是更好的选择。 (你似乎知道这一点,但我提到它是为了其他读者的利益。)

答案 1 :(得分:0)

我无法测试您正在执行的确切命令,但问题可能是它们实际上没有停止执行,这就是您的主进程不会停止的原因。

解决方法是:

  1. 使用isAlive()检查这些命令是否仍在执行(并在超时后终止这些进程)。
  2. 使用waitFor(long timeout, TimeUnit unit)方法使它们在超时后终止。然后,您可以使用exitValue()方法检查进程是否正常退出。

答案 2 :(得分:0)

看看你的例子,看起来你正试图在mysql上运行sql命令。

首先,如果您真的想使用msqyl命令行命令执行此操作,则需要将其输入/输出重定向到java InputStream / OutputStream,然后将您的SQL请求发送到mysql进程输入。您可能会关注此示例:

    List<String> command = new ArrayList<>();
    command.add("mysql -u root -p ********");
    ProcessBuilder pb = new ProcessBuilder(command);
    Process process = pb.start();
    PrintStream commandIn = new PrintStream(process.getOutputStream());
    commandIn.println("select * from employee;");

其次,在mysql实例上运行SQL命令的最佳方法是使用JDBC而不是mysql命令行工具。寻找那里的众多JDBC教程。

这是一个更完整(和工作)的例子。 看看这个&#34;命令行工具&#34;:

public class TestCmd {

    public static void main(String[] args) throws IOException
    {
        System.out.println("Started. args[0]=" + args[0]);

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        for(;;)
        {
            String line = in.readLine();
            if (line == null) break;
            System.out.println("echo:" + line);
        }
    }
}

然后是&#34;驱动程序&#34; program witch演示如何向此命令行工具发送命令:

public class TestDriver {

    final static String JAVA_EXE = "C:\\...\\java.exe";
    final static String CLASS_BASEPATH = "C:\\...\\java\\bin";

    public static void main(String[] args) throws Exception
    {
        List<String> command = new ArrayList<>();
        command.add(JAVA_EXE.toString());
        command.add("-classpath");
        command.add(CLASS_BASEPATH);
        command.add("TestCmd");
        command.add("Parameter");
        ProcessBuilder pb = new ProcessBuilder(command);
        pb.redirectOutput(new File("c:\\temp\\out.txt"));

        Process process = pb.start();
        PrintStream commandIn = new PrintStream(process.getOutputStream());

        commandIn.println("first input line");
        commandIn.flush();
        commandIn.println("second input line");
        commandIn.flush();

        // give some time to the sub process to finish writing its output
        Thread.sleep(100);

        process.destroy();
    }
}

在输出&#34; out.txt&#34;你会得到的,如预期的那样:

Started. args[0]=Parameter
echo:first input line
echo:second input line