Подтвердить что ты не робот

Запуск оболочки 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();
    }
4b9b3361

Ответ 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);