Запустить Perl-скрипт через Java с помощью ProcessBuilder

1

У меня есть скрипт perl, который я пытаюсь выполнить через оболочку. Обычным вызовом оболочки UNIX является: /home/projects/bumble/script.pl --input/home/input/input.txt>/home/output/output.txt.

Для этого в Java я написал функцию:

public void runCommand(String command, File directory) { 
    final ProcessBuilder pb = new ProcessBuilder(command);
    pb.directory(directory);
    final Process process = pb.start();
    if(process.waitFor() != 0) {
        throw new RuntimeException("ERROR");
    }
}

Я называю это:

String command = "/home/projects/bumble/script.pl --input /home/input/input.txt > /home/output/output.txt";
File directory = new File("/home/projects/bumble");
runCommand(command,directory);

Исключением, которое я получаю, является: java.io.IOException:... Не удается запустить программу error = 2, Нет такого файла или каталога

Я заметил здесь: java.io.IOException: Не удается запустить программу error = 2, Нет такого файла или каталога, подразумевает, что запущенные программы с полным вводом с> в совершенно другой каталог не сработают. Если я просто запустил команду /home/projects/bumble/script.pl --input/home/input/input.txt, также сбой с той же ошибкой. Я запускаю его прямо через оболочку, он работает. Есть что-то, что я пропускаю или делаю неправильно?

  • 0
    Я предполагаю, script.pl первой строке script.pl есть #!/usr/bin/perl или что-то подобное? Я не уверен, понимает ли это ProcessBuilder , поэтому вам, возможно, придется запустить ProcessBuilder для запуска оболочки, то есть String command = "sh /home/projects/... (или даже "/bin/sh /home/projects/... ). Я никогда не использовал Java в Linux / Unix, поэтому я не уверен в этом, но, возможно, стоит попробовать.
  • 0
    Да, это первая строка. Спасибо, я попробую это.
Показать ещё 2 комментария
Теги:

1 ответ

1
Лучший ответ

Ловушки Runtime.exec(): http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=3

2 проблемы с кодом: команда должна быть разбита на строку [], например:

String[] command = {"perl", "/home/projects/bumble/script.pl", "--input", "/home/input/input.txt"}

Выход должен обрабатываться отдельно без перенаправления ">". Для этого ProcessBuilder имеет перенаправление. http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.Redirect.html

Программно функция:

public static void runCommand(final String[] command, final File directory, final File output) throws IOException, InteruptException {
    final ProcessBuilder pb = new ProcessBuiler(command); 
    pb.redirectErrorStream(true); //optional; easier for this case to only handle one stream
    pb.redirectOutput(Redirect.to(output));
    final Process p = pb.start();

    if(p.waitFor != 0) {
        //throw an exception / return error message
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню