У меня есть 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);
И я получаю вывод: Не удалось скопировать. Просто интересно, что может быть причиной этого?
Я бы рассмотреть вопрос об использовании 'ProcessBuilder' вместо' Runtime.exec' как это позволит уточнить каждую часть команды как отдельный 'String', который поможет с параметрами цитирования (как вам не нужно) и параметрами с пробелами. Может не исправить ближайшую проблему, но поможет решить и устранить другие потенциальные проблемы. – MadProgrammer
как @MadProgrammer сказал, что использование 'ProcessBuilder' также облегчит отладку – Epicblood
Спасибо за предложение. Я уже пробовал ProcessBuilder, но это не помогло :( –