急---!在线等待!: Java程序调用外部命令的问题(解决问题,给100分!)

nj_cxl 2006-01-18 05:51:42
通过Java程序,点击画面的Botton去掉用batch(command命令行),OS=Unix,Server=Tomcat+Soap
Source:Runtime rt = Runtime.getRuntime();
Process prc = rt.exec(cmd);
例:cmd=/home/project/Batch.sh batchId

结果被调用的进程一直在那里hang住不执行,每点一次button,多生成一个在那里堆积着:(。用ps察看,sh和java的都有,但是,当画面的tomcat关闭后,那个被启动的batch进程就可以执行并且很快结束。然后我又启动tomcat,再从画面上调用batch,又死在那里

不知道什么原因,那位大虾帮忙分析一下,感激涕零!
...全文
177 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxjz2 2006-02-10
  • 打赏
  • 举报
回复
由于有些本地平台为标准输入和输出流所提供的缓冲区大小有限,如果不能及时写入子进程的输入流或者读取子进程的输出流,可能导致子进程阻塞,甚至陷入死锁

Process proc = Runtime.getRuntime().exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
StreamGobbler outPutGobbler = new StreamGobbler(proc.getInputStream());

// 处理缓冲区数据
errorGobbler.start();
outPutGobbler.start();

class StreamGobbler extends Thread {
InputStream is;
StringBuffer buffer = new StringBuffer();

StreamGobbler(InputStream is){
this.is = is;
}

public String toString(){
return buffer.toString();
}

public void run(){
InputStreamReader isr = null;
try{
isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while( (line = br.readLine()) != null){
buffer.append(line+"\n");
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
cuij7718 2006-01-18
  • 打赏
  • 举报
回复
在win下面调过,但是没有调过shell脚本,帮你顶
不过看看不获得 rt.exec(cmd);的返回对象行不行,或是获得以后继续读取输出的数据流,看看行不行,
Process process=runtime.exec("xxxx");
InputStream inputStream=process.getInputStream();
byte[] bytes=new byte[1024];
int ibyte=0;
while((ibyte=inputStream.read(bytes))>0)
{
String str1=new String(bytes,0,ibyte,"GBK");
System.out.print(str1);
}
OnlyFor_love 2006-01-18
  • 打赏
  • 举报
回复
不太理解 关注一下吧

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧