how to run a command at terminal from java program?

前端 未结 6 2154
孤城傲影
孤城傲影 2020-11-29 03:14

I need to run a command at terminal in Fedora 16 from a JAVA program. I tried using

Runtime.getRuntime().exec(\"xterm\"); 

but this just op

相关标签:
6条回答
  • 2020-11-29 03:52

    I don't know why, but for some reason, the "/bin/bash" version didn't work for me. Instead, the simpler version worked, following the example given here at Oracle Docs.

    String[] args = new String[] {"ping", "www.google.com"};
    Process proc = new ProcessBuilder(args).start();
    
    0 讨论(0)
  • 2020-11-29 03:55

    I vote for Karthik T's answer. you don't need to open a terminal to run commands.

    For example,

    // file: RunShellCommandFromJava.java
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class RunShellCommandFromJava {
    
        public static void main(String[] args) {
    
            String command = "ping -c 3 www.google.com";
    
            Process proc = Runtime.getRuntime().exec(command);
    
            // Read the output
    
            BufferedReader reader =  
                  new BufferedReader(new InputStreamReader(proc.getInputStream()));
    
            String line = "";
            while((line = reader.readLine()) != null) {
                System.out.print(line + "\n");
            }
    
            proc.waitFor();   
    
        }
    } 
    

    The output:

    $ javac RunShellCommandFromJava.java
    $ java RunShellCommandFromJava
    PING http://google.com (123.125.81.12): 56 data bytes
    64 bytes from 123.125.81.12: icmp_seq=0 ttl=59 time=108.771 ms
    64 bytes from 123.125.81.12: icmp_seq=1 ttl=59 time=119.601 ms
    64 bytes from 123.125.81.12: icmp_seq=2 ttl=59 time=11.004 ms
    
    --- http://google.com ping statistics ---
    3 packets transmitted, 3 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 11.004/79.792/119.601/48.841 ms
    
    0 讨论(0)
  • 2020-11-29 03:59

    You don't actually need to run a command from an xterm session, you can run it directly:

    String[] arguments = new String[] {"/path/to/executable", "arg0", "arg1", "etc"};
    Process proc = new ProcessBuilder(arguments).start();
    

    If the process responds interactively to the input stream, and you want to inject values, then do what you did before:

    OutputStream out = proc.getOutputStream();  
    out.write("command\n");  
    out.flush();
    

    Don't forget the '\n' at the end though as most apps will use it to identify the end of a single command's input.

    0 讨论(0)
  • 2020-11-29 04:04

    I know this question is quite old, but here's a library that encapsulates the ProcessBuilder api.

    0 讨论(0)
  • 2020-11-29 04:07

    As others said, you may run your external program without xterm. However, if you want to run it in a terminal window, e.g. to let the user interact with it, xterm allows you to specify the program to run as parameter.

    xterm -e any command
    

    In Java code this becomes:

    String[] command = { "xterm", "-e", "my", "command", "with", "parameters" };
    Runtime.getRuntime().exec(command);
    

    Or, using ProcessBuilder:

    String[] command = { "xterm", "-e", "my", "command", "with", "parameters" };
    Process proc = new ProcessBuilder(command).start();
    
    0 讨论(0)
  • 2020-11-29 04:09

    You need to run it using bash executable like this:

    Runtime.getRuntime().exec("/bin/bash -c your_command");
    

    Update: As suggested by xav, it is advisable to use ProcessBuilder instead:

    String[] args = new String[] {"/bin/bash", "-c", "your_command", "with", "args"};
    Process proc = new ProcessBuilder(args).start();
    
    0 讨论(0)
提交回复
热议问题