views:

1442

answers:

1

Hi, I tried with many different examples, but it is not working.

I would really appreciate some sample Java code to run a shell script.

+4  A: 

You need Runtime.getRuntime().exec(...). See a very extensive example (don't forget to read the first three pages).

Keep in mind that Runtime.exec is not a shell; if you wish to execute a shell script your command line would look like

/bin/bash scriptname

That is, the shell binary you need is fully qualified (although I suspect that /bin is always in the path). You can not assume that if

myshell> foo.sh

runs,

Runtime.getRuntime.exec("foo.sh");

also runs as you are already in a running shell in the first example, but not in the Runtime.exec.

A tested example (Works on My Linux Machine(TM)), mosly cut-and-past from the previously mentioned article:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ShellScriptExecutor {

    static class StreamGobbler extends Thread {
     InputStream is;

     String type;

     StreamGobbler(InputStream is, String type) {
      this.is = is;
      this.type = type;
     }

     public void run() {
      try {
       InputStreamReader isr = new InputStreamReader(is);
       BufferedReader br = new BufferedReader(isr);
       String line = null;
       while ((line = br.readLine()) != null)
        System.out.println(type + ">" + line);
      } catch (IOException ioe) {
       ioe.printStackTrace();
      }
     }
    }


    public static void main(String[] args) {
     if (args.length < 1) {
      System.out.println("USAGE: java ShellScriptExecutor script");
      System.exit(1);
     }

     try {
      String osName = System.getProperty("os.name");
      String[] cmd = new String[2];
      cmd[0] = "/bin/sh"; // should exist on all POSIX systems
      cmd[1] = args[0];

      Runtime rt = Runtime.getRuntime();
      System.out.println("Execing " + cmd[0] + " " + cmd[1] );
      Process proc = rt.exec(cmd);
      // any error message?
      StreamGobbler errorGobbler = new StreamGobbler(proc
        .getErrorStream(), "ERROR");

      // any output?
      StreamGobbler outputGobbler = new StreamGobbler(proc
        .getInputStream(), "OUTPUT");

      // kick them off
      errorGobbler.start();
      outputGobbler.start();

      // any error???
      int exitVal = proc.waitFor();
      System.out.println("ExitValue: " + exitVal);
     } catch (Throwable t) {
      t.printStackTrace();
     }
    }
}
extraneon
if script is 'chmod +x'd and has first line #!/bin/sh, then it can be executed directly.
Vardhan Varma
Also in a Runtime.exec() ? I thought it was the shell which checks the first line of the script to see if it starts with a #!. It's always great to learn something new.
extraneon