0

私はすべての助けを求めています.私はJavaを使用しており、アスタリスクでチャネルの詳細を取得するために使用されるコマンドを実行したいと考えています. システムは Linux ベースです。コマンド「core show channels」を実行したいと同時に、チャネルもgrepしたい

以下は、コンソールで正常に起動したときのコマンドと出力です。

   asterisk -vvvvvrx 'core show channels' | grep channels

出力は2つのアクティブチャンネルです

Javaで次のコードを使用しようとしています

import java.io.IOException;
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ProcessBuilderExample
{
  public static void main(String[] args) 
  throws IOException, InterruptedException
  {
  String[] commands = new String[]{"asterisk","-rx","core show channels","| grep 'channels'"};
 Process p = Runtime.getRuntime().exec(commands);
    p.waitFor();
   BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
   String line = "";
while((line = br.readLine()) != null) {
      System.out.println(line);
}
    System.out.println("hello");
  }
}

しかし、正しい出力が表示されません pls はこの問題を解決するのを手伝ってくれます

4

2 に答える 2

0

あなたはコマンド引数と配管の間で混乱しています。あなたがそれを言うとき、cmda | cmdbそれは本質的に実行cmdaしてその出力をの入力として渡すことを意味しますがcmdb、あなたのコードは文字列「|cmdb」を引数として渡しますcmda

コードを修正する方法はいくつかありますが、最も簡単な方法は、最後のgrep引数を取り除くことだと思います。

String[] commands = new String[]{"asterisk","-rx","core show channels"};

次に、結果をループするときに、contains()Stringクラスのメソッドを使用して、文字列チャネルが含まれているかどうかを確認します。

while((line = br.readLine()) != null) {
  if(line.contains("channels")  System.out.println(line);
}
于 2013-02-04T06:11:09.973 に答える
0

変更してみる

String[] commands = new String[]{"asterisk","-rx","core show channels","| grep 'channels'"};

に:

String[] commands = new String[]{"/bin/sh", "-c", "asterisk -rx 'core show channels' | grep 'channels'"};

理由:

垂直バーは "\|" (つまり、パイプの代わりに文字通り "|") として解釈されます。代わりにシェル コマンド (/bin/sh) を呼び出し、コマンド全体を引数として指定すると、垂直バーは次のようになります。正しく解釈されます。

于 2013-02-04T06:18:41.147 に答える