Запуск оболочки bash script в java
Я хочу запустить оболочку script из моей программы ниже, но она ничего не делает. Я запустил ту же самую команду непосредственно в терминале linux, и он отлично работает, поэтому я предполагаю, что это мой код Java. Как вы можете видеть, я впервые написал команду в оболочку script с помощью PrintWriter, но я ожидаю, что это не повлияет на работу самой оболочки script. Любая помощь будет оценена!
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();
}
Ответы
Ответ 1
Чтобы получить результат, вы должны использовать возвращенный Process
.
Runtime#exec
выполняет эту команду как отдельный процесс и возвращает объект типа Process
. Вы должны вызвать Process#waitFor
, чтобы ваша программа дождалась завершения нового процесса. Затем вы можете вызвать Process.html#getOutputStream()
в возвращаемом Process
для проверки вывода выполненной команды.
Альтернативным способом создания процесса является использование ProcessBuilder
.
Process p = new ProcessBuilder("myCommand", "myArg").start();
С ProcessBuilder
вы перечисляете аргументы команды как отдельные аргументы.
См. Различие между ProcessBuilder и Runtime.exec() и ProcessBuilder vs Runtime.exec() для узнать больше о различиях между Runtime#exec
и ProcessBuilder#start
.
Ответ 2
Попробуйте, это сработает.
String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"};
Process pr = Runtime.getRuntime().exec(cmd);
Ответ 3
Когда вы выполняете script из Java, он создает новую оболочку, где переменная среды PATH не является
задавать.
Настройка переменной env PATH с использованием приведенного ниже кода должна запускать ваш 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);