2

我有一个运行星号的 linux 服务器,我想知道它是否已重新启动或服务器中发生了什么,所以我编写了一个 java 应用程序来读取控制台。喜欢这里(http://www.coderanch.com/t/556707/java/java/connect-Linux-Java-code);这是一个很好的例子。

但是这里有一个问题:

      String user=host.substring(0, host.indexOf('@'));      
  host=host.substring(host.indexOf('@')+1);

  Session session=jsch.getSession(user, host, 22);
   UserInfo ui=new MyUserInfo();
   session.setUserInfo(ui);  
   session.connect();

   String command=  "asterisk -rvvv | grep 'Disconnect' ";

   Channel channel=session.openChannel("exec"); 
   ((ChannelExec)channel).setCommand(command);

   channel.setInputStream(null);

   ((ChannelExec)channel).setErrStream(System.err);

   InputStream in=channel.getInputStream(); 

   channel.connect();
 while(in.available()==0){  
      int i=in.read(tmp, 0, 1024);  
      if(i<0)
      {break;}
      System.out.print("-"+new String(tmp, 0, i));  

    } 

当我执行asterisk -rvvvvv | grep 'Disconnect时,它给了我一个空白行,并且此代码逐行读取到控制台。所以如果我在这个空白行之后得到任何数据,什么都没有给我。程序卡在那里。所以我需要在空行之后阅读第二行。 控制台示例 或任何想法阅读此“断开连接”字符串?

我的主要目的 - “星号重启了吗?” - 因为当星号重新启动时,会给出一个这样的字符串,而我们不知道星号为什么会重新启动!

4

2 回答 2

0

您可以使用:asterisk -rvvvv | grep -v ^$ | grep 'Disconnect' grep 命令将删除空行

于 2013-03-01T06:08:08.650 回答
0

我正在使用jsch。您需要等待足够的时间才能准备好缓冲区,因此需要使用 try{Thread.sleep(1000);}catch(Exception ee){}。至少我是这样使用的。

 while(true){
        while(in.available()>0){
          int i=in.read(tmp, 0, 1024);
          if(i<0)break;
          System.out.print(new String(tmp, 0, i));
        }
        if(channel.isClosed()){
          System.out.println("exit-status: "+channel.getExitStatus());
          break;
        }
        try{Thread.sleep(1000);}catch(Exception ee){}
      }
      channel.disconnect();
      session.disconnect();
    }
    catch(Exception e){
      System.out.println(e);
    }
  }
于 2013-03-01T06:38:12.490 回答