2015-07-30 3 views
0

У меня есть Java-программа, которая работает в Linux и пытается вызвать один сценарий оболочки. Этот сценарий оболочки пытается скопировать локальный каталог на другой сервер. Способ вызова скрипта:Не удается выполнить сценарий оболочки из Java-программы

bash copy_logs.sh "TestResults/07232015042652" 

Когда я называю это из Linux терминала, каталог копируется на удаленный сервер успешно. Теперь я хочу выполнить это из программы Java. Мой фрагмент кода выглядит следующим образом:

Sting direc = "07232015042652" 
p = Runtime.getRuntime().exec("bash copy_logs.sh \"TestResults/"+direc+"\""); 

Когда я запускаю это, хотя я не получаю сообщение об ошибке или исключение, но файл никогда не копируется.

Содержание copy_logs.sh выглядит следующим образом:

scp -r $TS [email protected]:/home/apacheweb/html/Weekly_Status/prov_check/ 
if [ $? -eq 0 ] 
then 
     echo "File copied successfully" 
else 
echo "Failed to copy" 

Я попытался напечатать результат исполнения

InputStream is = p.getInputStream(); 
    StringBuilder sb = new StringBuilder(); 

    int i=0; 
    try { 
     while ((i=is.read())!=-1){ 
      sb.append((char)i); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println(sb); 

И я получаю вывод: Не удалось скопировать. Просто интересно, что может быть причиной этого?

+1

Я бы рассмотреть вопрос об использовании 'ProcessBuilder' вместо' Runtime.exec' как это позволит уточнить каждую часть команды как отдельный 'String', который поможет с параметрами цитирования (как вам не нужно) и параметрами с пробелами. Может не исправить ближайшую проблему, но поможет решить и устранить другие потенциальные проблемы. – MadProgrammer

+0

как @MadProgrammer сказал, что использование 'ProcessBuilder' также облегчит отладку – Epicblood

+0

Спасибо за предложение. Я уже пробовал ProcessBuilder, но это не помогло :( –

ответ

0

Понял работает по:

ProcessBuilder pb = new ProcessBuilder("bash", "-c", "/bin/bash copy_logs.sh \"TestResults/"+directoryName+"\""); 
Process shell = pb.start(); 
Смежные вопросы