大家好,我遇到一个很奇怪的问题,我也在百度和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环境中可以使用的
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环境中可以使用的
解决方案 »
- 关于PreparedStatement的问题 小弟求帮助
- 国外网站发送短信
- hibernate 按时间段更新数据问题
- apache james邮件服务器问题,解决重答谢!
- 求年、月份相等的HQL,不用对比日。如:where time=2009-2
- 我要到澳门工作了,谁知道澳门那里有屋租?
- ldap 创建活动目录 和创建Exchange邮箱书
- 北大青鸟Aptech西安毕诚学校高薪诚聘Java,J2EE,.NET培训师
- 我在weblogic 中布置了rmi 并且启动也成功了,但是。。。 不够可以在加分
- Spring Boot提倡的微服务是否和多层框架(Entity,dao,service等)有冲突?
- hibernate+spring 总是报空指针的错误。nullpointer
- 面试提问解答,求帮助
tomcat启动的java程序就不能调用么