java远程调用shell返回执行成功实际没执行?

qijidehai 2010-03-11 08:48:03
java远程调用shell返回执行成功实际没执行。shell的脚本是一个清除一系列数据库临时表的脚本,清除语句后会打印清除成功,每清除一个表都会打印该表删除成功。操作系统是AIX5.3。直接登录运行没问题。但是用java调用脚本,再得到执行后操作系统打印的内容,和直接执行一样都显示每个表都清除成功。但实际上检查临时表没被删除。而直接登录执行shell是可以删除的。直接登录执行这个shell脚本大概要15分钟才能执行完。而用java调用则几秒钟就到最后一步了,打印最后一个表清除成功。

怀疑是权限问题。但是用这个权限去连接控制的数据库查询、删除、插入操作均可执行。且直接登录的用户名就是java配置的中的用户名。

请问有高手知道这是为什么么?

代码恕小弟不能发出来。但据说是几个月前还可以的,一个多月前突然不知道为什么就不可以了。
...全文
1524 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_ZJian 2012-06-15
  • 打赏
  • 举报
回复
java 通过 ssh2 方式远程调用 AIX 操作系统上的 shell 执行一个程序 该程序向 informix 数据库中插入数据。调用后shell 执行成功,日志文件生成了,也能打印输出,问题就是没有向 informix 数据库中插入数据。
但是如果 通过 telnet 工具登陆到 AIX 服务器去执行该 shell 去调用程序向 数据库中插入数据是可以成功的。新手求指教
guyuxuelang 2010-03-12
  • 打赏
  • 举报
回复
一点都不了解,路过,帮你顶一下
bayougeng 2010-03-12
  • 打赏
  • 举报
回复
1.既然是telnet,你可以试试从cmd中直接telnet,再执行命令试试。
输入:telnet
欢迎使用 Microsoft Telnet Client

Escape 字符是 'CTRL+]'

Microsoft Telnet> open
( 到 )192.168.x.x
然后用户名,密码,执行shell。
2.我想看看你的shell脚本。
youlaiyouwang 2010-03-12
  • 打赏
  • 举报
回复
在另一台服务器上可以执行,说明java和shell代码都没有问题。有问题的是环境,建议楼主对比下环境的差异,相信会有收获。
qijidehai 2010-03-12
  • 打赏
  • 举报
回复
我查了权限是777,我也不是怀疑权限。是实在不知道为什么。。。。。。因为这些代码从来没改过,目前在另一台服务器上可以正常运行,在这个服务器上突然就成这个样子了,以前也可以运行。 头大啊~
qijidehai 2010-03-12
  • 打赏
  • 举报
回复
看代码是TELNET做的。

怀疑权限是因为之前一直是可以的,只是几个月前不行了,但是前面的同事没有解决,一直瞒着在,等我来后才发现这个问题。我对比了关于调用shell的代码一年来都没有改动过,而且同样的代码在另一个服务器上可以执行,所以我怀疑不一定是代码的问题。
youlaiyouwang 2010-03-12
  • 打赏
  • 举报
回复
既然lz怀疑是权限问题,建议先将 用到的 所有 shell 脚本赋 777 的权限再测试一下。
qijidehai 2010-03-12
  • 打赏
  • 举报
回复
public class TelnetNew {
private static Logger logger=Logger.getLogger(TelnetNew.class);
private TelnetWrapper tw=new TelnetWrapper();

/**
* 得到连接数据库服务器的TELNET类
* @throws IOException
*/
public void getDbTelnet() throws IOException{
MonitorCfg mc=MonitorCfg.getInstance();
try {
tw.connect(mc.getIp("db"),mc.getPort("db"));
tw.login(mc.getUser("db"), mc.getPassword("db"));
} catch (IOException e) {
logger.error("连接或登录主机发生异常:"+e.getMessage());
throw e;
}
}
/**
* 发送命令
* @param cmd
*/
public void sendCmd(String cmd) throws IOException{
try {
tw.send(cmd);
} catch (IOException e) {
logger.error("执行telnet命令发生异常:"+e.getMessage());
throw e;
}
}
/**
* 得到服务器信息
* @return
* @throws Exception
*/
public String getMsg() throws Exception{
String result="";

int readInt=0;
byte[] bytes=new byte[1024*50];
try {
Thread.sleep(300L);

readInt=tw.read(bytes);
result=new String(bytes,0,readInt);

} catch (Exception e) {
logger.error("得到服务器返回信息时发生异常:"+e.getMessage());
}

return result;
}
/**
* 关闭telnet
* @throws IOException
*/
public void closeTelnet() throws IOException{
try {
tw.disconnect();
} catch (IOException e) {
logger.error("关闭telnet时发生异常:"+e.getMessage());
}
}
qijidehai 2010-03-12
  • 打赏
  • 举报
回复
shell脚本是放在服务器上的,执行错误后会打印fail,成功会打印succ。判断有没有执行完的标准就是看是否打印到succ。现在调试的结果是很快出现了succ,于是系统判断脚本执行完成。而shell每一步执行完成的LOG也是完整的。但实际上我查询那些应该刷出的临时表取还有数据。而我直接登录调用时可以删掉的。
bayougeng 2010-03-12
  • 打赏
  • 举报
回复
你为什么怀疑是权限的问题呢?
java远程执行,是通过ssh登录后执行的么?
qijidehai 2010-03-12
  • 打赏
  • 举报
回复
public void executeShell(ProcModel pm) throws Exception{
String[] result=new String[2];

MonitorCfg mc=MonitorCfg.getInstance();
TelnetNew telnet=new TelnetNew();
//是否连接成功标识
boolean flag=false;
try{
telnet.getDbTelnet();
flag=true;
}catch(Exception e){
//可能是超时,第二次连接
telnet.getDbTelnet();
flag=true;
}

if (flag) {
try {
// 执行shell命令
telnet.sendCmd(mc.getShellDir("db") + "/" + pm.getProcname()
+ " " + pm.getEtlDt());
String rInfo = "";
while ((rInfo = StringHelper.convertStringNull(telnet.getMsg()))
.indexOf("Fail") < 0
&& rInfo.indexOf("Succ") < 0) {
if (!rInfo.equals(""))
logger.info(rInfo);
continue;
}
logger.info(rInfo);
if (rInfo.trim().indexOf("Succ") > -1) {
result[0] = "1";
result[1] = "执行shell成功";
} else {
result[0] = "0";
result[1] = "执行shell失败";
}
} catch (IOException e) {
result[0] = "0";
result[1] = "执行shell失败";
logger.info("执行Shell发生异常:" + e.getMessage());
throw e;
} catch (InterruptedException e) {
result[0] = "0";
result[1] = "执行shell失败";
logger.info("执行Shell发生异常:" + e.getMessage());
throw e;
} finally {
if (telnet != null)
telnet.closeTelnet();
}

pm.setSucc_flag(result[0]);
pm.setErrMsg(result[1]);
} else {
throw new Exception();
}
}
qijidehai 2010-03-12
  • 打赏
  • 举报
回复
shell是执行了的,因为shell里面打印的语句都执行了,但是shell里面删表的语句没有执行。

代码不发是因为不是我写的代码,里面很乱,发出来又解释半天,哎。到不是保密问题。我试试看截取一些出来。
zliuzz 2010-03-12
  • 打赏
  • 举报
回复
学习中。。。。。。。
okmyhoney 2010-03-12
  • 打赏
  • 举报
回复
虚心学习@
BearKin 2010-03-12
  • 打赏
  • 举报
回复
学习
bayougeng 2010-03-11
  • 打赏
  • 举报
回复
你说的远程调用是如何调用的?
通过ssh登录,然后执行shell脚本么?shell脚本的stderr是重定向到stdout中?
什么代码这么神秘?敏感信息你可以去掉,用***代替嘛。
chen09 2010-03-11
  • 打赏
  • 举报
回复
是remote shell吧?要有权限的,开了没?
hanjinchidm 2010-03-11
  • 打赏
  • 举报
回复
学习.
qijidehai 2010-03-11
  • 打赏
  • 举报
回复
挺郁闷的,当时前面的人发现了问题不解决,我后来接手都没改过这部分的代码,现在问题要解决了,完全没有头绪。
sotom 2010-03-11
  • 打赏
  • 举报
回复
调用 Ant脚本操作数据库的用过,Shell的不知道了。

67,513

社区成员

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

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