Reputation: 471
I want to run a shell script from my program below but it doesn't seem to do anything. I've run the same command directly in the linux terminal and it works fine so I'm guessing it's my java code. As you can see, I was first writing the command to the shell script using a PrintWriter but I expect that this would not effect the running of the shell script itself. Any help would be appreciated!
public static void main(String[] args) {
// TODO Auto-generated method stub
String nfdump = "nfdump -o csv -r /home/shane/Documents/nfdump/nfcapd.201211211526>blank.txt";
try {
FileWriter fw = new FileWriter("/home/shane/Documents/script.sh");
PrintWriter pw = new PrintWriter(fw);
pw.println("#!/bin/bash");
pw.println(nfdump);
pw.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Process proc = null;
try {
proc = Runtime.getRuntime().exec("sh /home/shane/Documents/script.sh");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Upvotes: 20
Views: 100128
Reputation: 1612
When you execute a script from Java it spawns a new shell where the PATH environment variable is not set.
Setting the PATH env variable using the below code should run your script.
String[] env = {"PATH=/bin:/usr/bin/"};
String cmd = "you complete shell command"; //e.g test.sh -dparam1 -oout.txt
Process process = Runtime.getRuntime().exec(cmd, env);
Upvotes: 10
Reputation: 1499
Try this, it will work.
String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"};
Process pr = Runtime.getRuntime().exec(cmd);
Upvotes: 9
Reputation: 14728
You should use the returned Process
to get the result.
Runtime#exec
executes the command as a separate process and returns an object of type Process
. You should call Process#waitFor
so that your program waits until the new process finishes. Then, you can invoke Process.html#getOutputStream()
on the returned Process
object to inspect the output of the executed command.
An alternative way of creating a process is to use ProcessBuilder
.
Process p = new ProcessBuilder("myCommand", "myArg").start();
With a ProcessBuilder
, you list the arguments of the command as separate arguments.
See Difference between ProcessBuilder and Runtime.exec() and ProcessBuilder vs Runtime.exec() to learn more about the differences between Runtime#exec
and ProcessBuilder#start
.
Upvotes: 33