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と、空白行が表示され、このコードは行ごとにコンソールに読み込まれます。したがって、この空白行の後にデータを取得しても、何も表示されません。プログラムはあそこに固執します。だから私は空白行の後の2行目を読む必要があります。 コンソールの例 または、この「切断」文字列を読み取るためのアイデアはありますか?

私の主な目的-「アスタリスクは再起動しましたか?」-アスタリスクが再起動すると、次のような文字列が表示され、アスタリスクが再起動する理由がわかりません。

4

2 に答える 2

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 に答える
0

使用できます:asterisk -rvvvv | grep -v ^$ | grep 'Disconnect' grepコマンドは空白行を削除します

于 2013-03-01T06:08:08.650 に答える