java执行带参数的shell命令

u010106946 2014-08-06 07:05:23
我想用java执行
/shell/kmeans.sh【空格】/shell【空格】kmeans.scala

然后在java程序里写
String cmd = “shell/kmeans.sh” + " " + "/shell" + " " + "kmeans.scala";
Runtime.getRuntime().exec(cmd).waitFor();


但是一跑就卡住,eclipse的控制台里什么都没有输出
因为kmeans.sh的作用是将kmeans.scala里的程序提交到spark-shell上运行
检查kmeans.sh输出的日志呢,发现卡在kmeans的语句上没有继续执行
无奈之下我kill了这段java程序的进程

但再查看输出的日志,结果居然补全了,而且运算结果与我直接在spak-shell里运行的一样

莫非我每算一次都需要kill它一次吗。。

不是运算的原因,因为运算量不大,但我等了五分钟再来看,还是卡着

我不知道这样到底是不是把后两个参数传进去了

因为它算出了结果,但我中途设置的许多标志信息都没有输出

但偶尔换个方式写,那些标志信息又可以很明白地告诉我,我的参数没输进去

今天纠结了一天
我还试过
string[] cmd = {"","","",""}的形式,
还有pid = Runtime.getRuntime().exec(cmd);的形式

到底问题出在哪里呢
是我的语句写法有问题,还是我这个思路压根就是错的?
...全文
569 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010106946 2014-08-07
  • 打赏
  • 举报
回复
引用 2 楼 vnvlyp 的回复:
Java Runtime.exec()注意事项 目测应该是 Java中Runtime.exec的一些事 这里的第二点
public class BadExecJavac2 {  
    public static void main(String args[]) {  
        try {  
            Runtime rt = Runtime.getRuntime();  
            Process proc = rt.exec("javac");  
            int exitVal = proc.waitFor();  
            System.out.println("Process exitValue: " + exitVal);  
        } catch (Throwable t) {  
           t.printStackTrace();  
        }  
    }  
}  
“ 不幸的是,这个程序也无法执行完成,它没有输出但却一直悬在那里!这是为什么那? JDK文档中的解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。 ” 解决方法请看原文第三点
牛叉,就是这个!! 谢谢
u010106946 2014-08-07
  • 打赏
  • 举报
回复
引用 1 楼 Cloudyxuq 的回复:
Runtime.getRuntime().exec(new String[] {"/bin/sh","-c","kmeans.sh  /shell  kmeans.scala
"},null,null);
经测试无效。。
vnvlyp 2014-08-06
  • 打赏
  • 举报
回复
Java Runtime.exec()注意事项

目测应该是 Java中Runtime.exec的一些事 这里的第二点

public class BadExecJavac2 {  
public static void main(String args[]) {
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("javac");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t) {
t.printStackTrace();
}
}
}



不幸的是,这个程序也无法执行完成,它没有输出但却一直悬在那里!这是为什么那?

JDK文档中的解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。


解决方法请看原文第三点
Tinker77 2014-08-06
  • 打赏
  • 举报
回复
Runtime.getRuntime().exec(new String[] {"/bin/sh","-c","kmeans.sh  /shell  kmeans.scala
"},null,null);

67,513

社区成员

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

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