linux下java执行shell命令

10yue 2007-06-22 01:21:15
我装的是linux8.0,mysql4.0,tomcat5.028,我想在jsp页面中调用shell命令来执行mysql数据库备份的命令。在linux的shell下,测试可以成功。命令如下:
[root@mynet mysql]# /usr/local/mysql/bin/mysqldump -u root -p7788919 axtic_cg >
/usr/xyz.sql
但是在jsp中却不行了。

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title></title>
</head>

<body>
<%
String commandstr = "/usr/local/mysql/bin/mysqldump -u root -p7788919 axtic_cg > /usr/xyz.sql";
Process p;
try
{
out.print("start backup\n");
p = Runtime.getRuntime().exec(commandstr);
if (p.waitFor() == 0)
{
out.print("backup over\n");

}
else
{
out.print("backup fail\n");

}
}
catch (Exception e)
{
out.print("backup fail\n");
out.println(e.toString());
}
%>
</body>
</html>
可是我把命令改成了String commandstr = "who am i"
却又显示的是backup over.
...全文
3650 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelseyes 2007-07-03
  • 打赏
  • 举报
回复
路过,顶一下
10yue 2007-06-24
  • 打赏
  • 举报
回复
谢谢。看看先。
10yue 2007-06-23
  • 打赏
  • 举报
回复
这是在jdk里面找到的,gameboy999你说的是这个吧

创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin,stdout,stderr)操作都将通过三个流 (getOutputStream(),getInputStream(),getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。
iwillrockyou 2007-06-23
  • 打赏
  • 举报
回复
学到东西了。。。
gameboy999 2007-06-23
  • 打赏
  • 举报
回复
去google搜索一下 ExecRunner pitfall

http://www.koders.com/java/fidE74E642685BBC1DC815063846EAB0BC63566E554.aspx
10yue 2007-06-23
  • 打赏
  • 举报
回复
没有找到清空
getOutputStream(),getInputStream(),getErrorStream(),
gameboy999,能发个例子吗?
10yue 2007-06-22
  • 打赏
  • 举报
回复
谢谢gameboy999指点,我找找资料。
10yue 2007-06-22
  • 打赏
  • 举报
回复
今天又测试了一下,在jsp中使用tomcat的命令可以执行。
String commandstr = "/usr/tomcat/bin/shutdown.sh";
这个命令可以执行,不知道为什么备份mysql的就不行了。大家帮忙看看。
10yue 2007-06-22
  • 打赏
  • 举报
回复
自己up
yingzi107 2007-06-22
  • 打赏
  • 举报
回复
程序员群 41801837
gameboy999 2007-06-22
  • 打赏
  • 举报
回复
原因是java runtime.process run的一个bug

网上有很多解决方案

只有把outputstream /error stream即使的清空,命令才能完成,否则会一直等待

而且linux/solaris下面默认的shell buffer很小,很容易出现这种情况
java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行shell脚本,可是在java代码中调用shell脚本时,报了如下4个错误: 1、sqlldr: command not found 2、sqlplus: command not found 3、0750: You may need to set ORACLE_HOME to your Oracle software directory 4、Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL$ 检查了dba用户和web用户下关于oracle的所有环境变量发现没有问题 (/home/oracle/.profile 与 /home/erm/.profile 环境变量文件为隐藏文件需使用 ls -a 命令查看) 在网上查了一遍以后有如下几种处理办法: 1、没有oracle_home目录的执行权限,无法进入到bin目录,使用chmod 755 $oracle_home更改目录权限;使用chmod 755 $oracle_home/lib更改目录权限;对目录$oracle_home/rdbms/mesg目录赋予相应权限;当需要给非oracle用户配置使用sqlldr时,不单需要配置环境变量,还需要把相关目录的访问权限赋予该用户。【采用此法测试以后还是出现上面的错误】 2、用sh直接执行shell和在java直接执行shell是有区别的,要在shell文件内增加oracle的环境变量即. /home/oracle/.bash_profile 这句话,否则在执行sqlldr会报如下异常: Message 2100 not found; No message file for product=RDBMS...... facility=UL 【采用此法测试以后继续报错,但是这个方法有引导作用,继续往下看】 因为我在linux环境下执行shell脚本时sqlldr命令和sqlplus命令是正常执行的,没有任何问题,但是在java代码中调用脚本时却报错,所有排除了其他原因,只可能是环境变量的问题, 于是我把oracle的所有环境变量直接复制到shell脚本文件中,在java中调用了一下,然后所有问题迎刃而解! 具体代码参看文件内容

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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