У меня есть скрипт 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, также сбой с той же ошибкой. Я запускаю его прямо через оболочку, он работает. Есть что-то, что я пропускаю или делаю неправильно?
Ловушки 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
}
}
script.pl
первой строкеscript.pl
есть#!/usr/bin/perl
или что-то подобное? Я не уверен, понимает ли этоProcessBuilder
, поэтому вам, возможно, придется запуститьProcessBuilder
для запуска оболочки, то естьString command = "sh /home/projects/...
(или даже"/bin/sh /home/projects/...
). Я никогда не использовал Java в Linux / Unix, поэтому я не уверен в этом, но, возможно, стоит попробовать.