【发布时间】:2015-07-30 00:29:06
【问题描述】:
我有一个在 Linux 上运行并尝试调用一个 shell 脚本的 java 程序。此 shell 脚本尝试将本地目录复制到另一台服务器。调用脚本的方式是:
bash copy_logs.sh "TestResults/07232015042652"
当我从 linux 终端调用它时,目录被成功复制到远程服务器。现在我想从 Java 程序中执行这个。我的代码 sn-p 如下:
Sting direc = "07232015042652"
p = Runtime.getRuntime().exec("bash copy_logs.sh \"TestResults/"+direc+"\"");
当我运行它时,虽然我没有收到任何错误或异常,但文件永远不会被复制。
copy_logs.sh 的内容如下:
scp -r $TS test@192.168.199.57:/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 所说,使用
ProcessBuilder也会更容易调试 -
感谢您的建议。我已经尝试过 ProcessBuilder 但没有帮助:(
-
没有说它会解决问题,但从长远来看它会帮助你解决它,就像正确使用它一样,它会消除你从
Runtime.exec得到的大部分歧义 -
Chillax madProgrammer,我只是告诉你它没有用,而不是责怪你先生..