java远程调用shell返回执行成功实际没执行。shell的脚本是一个清除一系列数据库临时表的脚本,清除语句后会打印清除成功,每清除一个表都会打印该表删除成功。操作系统是AIX5.3。直接登录运行没问题。但是用java调用脚本,再得到执行后操作系统打印的内容,和直接执行一样都显示每个表都清除成功。但实际上检查临时表没被删除。而直接登录执行shell是可以删除的。直接登录执行这个shell脚本大概要15分钟才能执行完。而用java调用则几秒钟就到最后一步了,打印最后一个表清除成功。怀疑是权限问题。但是用这个权限去连接控制的数据库查询、删除、插入操作均可执行。且直接登录的用户名就是java配置的中的用户名。请问有高手知道这是为什么么?代码恕小弟不能发出来。但据说是几个月前还可以的,一个多月前突然不知道为什么就不可以了。

解决方案 »

  1.   

    调用 Ant脚本操作数据库的用过,Shell的不知道了。
      

  2.   

    是remote shell吧?要有权限的,开了没?
      

  3.   

    你说的远程调用是如何调用的?
    通过ssh登录,然后执行shell脚本么?shell脚本的stderr是重定向到stdout中?
    什么代码这么神秘?敏感信息你可以去掉,用***代替嘛。
      

  4.   

    shell是执行了的,因为shell里面打印的语句都执行了,但是shell里面删表的语句没有执行。代码不发是因为不是我写的代码,里面很乱,发出来又解释半天,哎。到不是保密问题。我试试看截取一些出来。
      

  5.   

    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();
    }
    }
      

  6.   

    你为什么怀疑是权限的问题呢?
    java远程执行,是通过ssh登录后执行的么?
      

  7.   

    shell脚本是放在服务器上的,执行错误后会打印fail,成功会打印succ。判断有没有执行完的标准就是看是否打印到succ。现在调试的结果是很快出现了succ,于是系统判断脚本执行完成。而shell每一步执行完成的LOG也是完整的。但实际上我查询那些应该刷出的临时表取还有数据。而我直接登录调用时可以删掉的。
      

  8.   

    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());
    }
    }
      

  9.   

    既然lz怀疑是权限问题,建议先将 用到的 所有 shell 脚本赋 777 的权限再测试一下。
      

  10.   

    看代码是TELNET做的。怀疑权限是因为之前一直是可以的,只是几个月前不行了,但是前面的同事没有解决,一直瞒着在,等我来后才发现这个问题。我对比了关于调用shell的代码一年来都没有改动过,而且同样的代码在另一个服务器上可以执行,所以我怀疑不一定是代码的问题。
      

  11.   

    在另一台服务器上可以执行,说明java和shell代码都没有问题。有问题的是环境,建议楼主对比下环境的差异,相信会有收获。
      

  12.   

    1.既然是telnet,你可以试试从cmd中直接telnet,再执行命令试试。
    输入:telnet
    欢迎使用 Microsoft Telnet ClientEscape 字符是 'CTRL+]'Microsoft Telnet> open
    ( 到 )192.168.x.x
    然后用户名,密码,执行shell。
    2.我想看看你的shell脚本。
      

  13.   

    java 通过 ssh2 方式远程调用 AIX 操作系统上的 shell 执行一个程序 该程序向 informix 数据库中插入数据。调用后shell 执行成功,日志文件生成了,也能打印输出,问题就是没有向 informix 数据库中插入数据。
    但是如果 通过 telnet 工具登陆到 AIX 服务器去执行该 shell 去调用程序向 数据库中插入数据是可以成功的。新手求指教