2015-12-22 4 views
1

Я пытаюсь выполнить сценарий оболочки из Java. Сценарий должен загрузить файл из URL с помощью wget.Here идет мой код.Запуск сценария оболочки (содержащий wget) из Java

 public class RunShellScriptFromJava { 
     public static void main(String a[]) { 
     try { 
       ProcessBuilder pb = new ProcessBuilder("/bin/sh","script.sh"); 
       Process p = pb.start(); 
       p.waitFor(); 
       System.out.println("Success"); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    } 

Содержание script.sh

 echo "start" 
    wget http://alex.smola.org/drafts/thebook.pdf 
    echo "end" 

Мой вопрос: ли это правильный способ сделать это Если нет, пожалуйста, мне точку в правильном direction.It не бросает любое исключение, но я? см., что файл не загружается. Любой руководитель/помощь приветствуется.

Спасибо.

PS: Я дал разрешение на выполнение сценария

+0

Сценарий, выполняемый с Java, не получает нормальную среду оболочки. Перепишите сценарий для работы без него (т. Е. Полный путь) или посмотрите связанный дубликат о том, как установить среду для «ProcessBuilder». – azurefrog

ответ

0

Этот сценарий и ява пример работает, возможно указать полный путь к Wget, чтобы убедиться, что вы знаете, где PDF время сохранения.

$ javac RunShellScriptFromJava.java 
$ java RunShellScriptFromJava 
Success 
$ ls 
RunShellScriptFromJava.java thebook.pdf RunShellScriptFromJava.class script.sh 

Пример/обновленный сценарий:

wget -O /home/MYSER/test.pdf http://alex.smola.org/drafts/thebook.pdf 
+0

О да. Я так и не понял. Я указал место, подобное этому. wget -P/Пользователи/Ashray/coding/test http://alex.smola.org/drafts/thebook.pdf. И он появился! Благодаря! :) –

+0

Отлично! Предложение Криса Наурора проверить код ошибки - это разумный совет, вы должны это сделать. – emsworth

+0

Да!Я просто проверял, работает ли это. Я буду рассматривать их, когда я его реализую в своем проекте. –

1

Пример кода в этом вопросе не хватает обработки вокруг использования ProcessBuilder ошибки, так что вероятность того, что какая-то ошибка произошла, но вы не получаете видимость в нем.

Код возврата Process#waitFor игнорируется. Возвращаемое значение - это код выхода порожденного процесса. Я рекомендую проверить, не отличается ли это значение от нуля.

Существует также отсутствие обработки stdout или stderr, поэтому вы не будете знать, записывает ли возникший процесс какой-либо вывод, объясняющий, что произошло. Вы можете получить доступ к stdout и stderr, используя Process#getInputStream и Process#getErrorStream соответственно.

Обратите внимание, что процесс может зависать, если он полностью не потребляет потоки или, по крайней мере, перенаправляет их. Я заметил, что эта проблема особенно распространена в Windows. Стандартная техника заключается в том, чтобы порождать потоки фона, чтобы потреблять потоки. Этот предыдущий вопрос обсуждает эту технику и другие.

Java ProcessBuilder: Resultant Process Hangs

После обработки в коде Java ошибка усиливается, как это, я надеюсь, вы будете иметь больше шансов диагностировать то, что пошло не так со сценарием.

+0

Спасибо за ценные советы. Я буду помнить об этом в реальной реализации :) –

1

Правильный способ сделать это - использовать Java для загрузки файла вместо сценария оболочки. Проблема со сценариями оболочки заключается в том, что они зависят от системы. Используя их, вы теряете одно из основных преимуществ Java, которое является независимостью системы. В Java есть несколько библиотек, которые будут выполнять эту функцию. Для вас будет использоваться класс FileUtils из apache IO Commons.

URL url = new URL("http://alex.smola.org/drafts/thebook.pdf"); 
File download = new File('.'); 
FileUtils.copyURLToFile(url, download); 
Смежные вопросы