[英]Runtime.exec not running but no exception
我想使用Java在特定位置运行脚本。 如果我手动运行该脚本,它将运行良好:
/export/home/trace.sh param1 param2 param3 param4
这是我从Java运行脚本的代码:
try {
Runtime runtime = Runtime.getRuntime();
Process proc = null;
System.out.println("starting search");
proc = runtime.exec( pathServer + "/trace.sh " + fullDate + " " + fullDateTo + " " + mA.substring(2) + " " + mB.substring(2));
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
System.out.println("end search " + System.currentTimeMillis());
}
catch (Exception e)
{
System.out.println(e.toString());
e.printStackTrace();
}
如果脚本运行,它将在指定位置生成“ txt.dat”。 但是没有生成“ txt.dat”。 我试图找出异常是什么,但没有异常捕获。
我的代码已经正确了吗? 我怎么知道它是否正在处理脚本? 我如何捕获在此过程中发生的任何异常? 谢谢。
更新2
我添加了一些代码来打印getInputStream
和getErrorStream
。 对于getInputStream
,我什么也没得到,这意味着它为空。 对于getErrorStream
,我得到这个结果
Host key verification failed
我仍然不知道这个错误是什么意思。
Java应用程序在服务器B中运行。
通常,我尝试调用的脚本(在服务器B中)将SSH到服务器A并在服务器A中运行其他脚本。它将生成text.dat,然后sftp到服务器B。手动运行时,txt.dat成功生成并传输到服务器B。
更新3
感谢您的所有帮助和建议。 原来,我的Java应用程序在不同的用户下运行。 当我手动运行它时,我使用了另一个用户。 因此,我已将主机密钥从服务器B添加到服务器A。它现在已成功运行。
如果您的命令失败, Runtime.exec
不会引发异常。
您可以使用process.exitValue()
获得执行结果。
您也可以从您在代码中创建的process.getInputStream()
读取脚本输出,但由于某些原因而无法读取。 在脚本中放入一些echo
语句以进行调试。
您可以对代码进行很多改进。
ProcessBuilder
创建您的流程,而不是Runtime
。 它为您提供更多选择和更好的控制 像这样:
try {
ProcessBuilder builder = new ProcessBuilder()
.command("/export/home/trace.sh", param1, param2, param3, param4);
builder.redirectErrorStream(true);
System.out.println("starting search");
Process proc = builder.start();
final BufferedReader bufferedreader = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
new Thread() {
@Override
public void run() {
try {
String line = null;
StringBuffer buffer = new StringBuffer(2048);
while ((line = bufferedreader.readLine()) != null) {
buffer.append(line);
}
} catch (final IOException ioe) {
ioe.printStackTrace();
}
// Do something with process output, if needed
}
}.start();
proc.waitFor();
System.out.println("end search " + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
您可以调试或打印Process.getErrorStream
和Process.getInputStream
来检查子流程报告的错误。
我的猜测是您需要调用/bin/sh
作为主程序,并将脚本作为参数传递,但是我不确定。 我知道您必须在Windows上执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.