跪求各位兄弟姐妹,帮忙解决java调用shell脚本问题

蒙奇D路飞 2012-08-11 06:41:59
大家好,我遇到一个很奇怪的问题,我也在百度和google上搜了,通过java的Runtime可以调用shell命令,我的tomcat启动后,线程也确实出发了shell命令并执行了,但是我的应用不是一个shell命令,而是一个shell语言写的模块有多个脚本文件构成,其中有一个是调用的入口脚本,我将java中命令替换成 /bin/sh work.sh 就是不能调用 具体代码如下所示:
public static void execShell(String cmd) throws IOException {
int status = -1;
Runtime rt = Runtime.getRuntime();
String str[] = { "/bin/sh", "-c", cmd };
Process pcs = rt.exec(str);
BufferedReader br = new BufferedReader(new InputStreamReader(
pcs.getInputStream()));
InputStream stdout=pcs.getInputStream();
InputStream sterr=pcs.getErrorStream();
OutputStream stdin=pcs.getOutputStream();
String line = new String();

StringBuilder sb = new StringBuilder(" ");
BufferedReader reader = new BufferedReader(new InputStreamReader(sterr, "UTF-8"));
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
logger.error("sterr="+sb.toString());

while ((line = br.readLine()) != null) {
System.out.println(line);
}
try {
status = pcs.waitFor();
} catch (InterruptedException e) {
System.err.println("processes was interrupted");
logger.info(e.toString());
} catch(Exception ex){
logger.info(ex.toString());
}finally {
br.close();
logger.info("----"+cmd+" end "+status +" sterr "+sterr +" stdout "+stdout +" stdin "+stdin);
IOUtils.closeQuietly(stdout);
IOUtils.closeQuietly(sterr);
IOUtils.closeQuietly(stdin);
}
int ret = pcs.exitValue();
System.out.println(ret);
}


cmd 传入的 就是调用 shell脚本的命令,该命令在shell环境中可以使用的
...全文
148 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2012-08-12
  • 打赏
  • 举报
回复
就运行程序而言,两者本质上有啥区别呢?
不能运行,报啥错呢
ylovep 2012-08-12
  • 打赏
  • 举报
回复
java单独的程序可以调用shell脚本,但是tomcat启动的java程序就不能调用么?

楼主 这句话如何解释,java单独的程序可以调用shell
tomcat启动的java程序就不能调用么
蒙奇D路飞 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

尝试启动时指定其执行文件的完整路径。不能依赖“当前我 目录”这种概念。
[/Quote]我用的是绝对路径,不是相对路径 你说的这个问题我已经注意到,但是貌似还是不行的;java单独的程序可以调用shell脚本,但是tomcat启动的java程序就不能调用么?
MiceRice 2012-08-11
  • 打赏
  • 举报
回复
尝试启动时指定其执行文件的完整路径。不能依赖“当前目录”这种概念。

67,513

社区成员

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

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