- PR -

Javaからのsnmpwalkコマンドの表示速度が遅い。

投稿者投稿内容
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-06-07 10:10
現在、

java Main snmpwalk...

のように、引数としてsnmpwalkコマンドを受け取りそれを外部コマンドとして実行しています。

一応バッファを10MB設定してみたのですが、結果は変わりませんでした。どんな感じかというと、通常のように直接snmpwalkコマンドを実行するとスムーズに結果が出力されるのですが、javaから外部コマンドとして実行すると

出力→待ち→出力→待ち・・・

のような感じで出力されます。もし同じようなことをやったことがある方がいましたらご教授よろしくお願いします。

ソースとしては以下です。

public class Main {
/**
* BufferedReaderのバッファサイズ
*/
public static final int BUFSIZE = 1024 * 10000;
public static void main(String[] args) {
try {
// コマンドライン引数として、実行するコマンドを取得
String[] cmds = args;
// プロセスオブジェクトを生成
Process process = Runtime.getRuntime().exec(cmds);
// 外部コマンドの標準出力を取得するための入力ストリームを取得
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is), BUFSIZE);
// 標準出力を1行づつ取り出します
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}

}
}
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-06-07 14:47
プロセスを実行するスレッドと標準出力を取り出すスレッドが同じですね。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35682&forum=12
の最後に書いておいたSampleでsnmpwalkコマンドを実行してスムーズだったら、
別スレッドにしてないためプロセスの出力と受け取りがスムーズに切り替わってないためだと思います。
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-06-07 15:06
> だっちょさん

返信ありがとうございます。

すいません。条件を書くのを忘れていました。JDK5.xしか使わないんです。。。
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-06-07 15:06
> だっちょさん

返信ありがとうございます。

すいません。条件を書くのを忘れていました。JDK5.xしか使わないんです。。。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-06-07 15:49
readLineでしばらくThreadが他に遷移してないと考えると、
次のように修正してみたらどうでしょう?(確認してませんが)

コード:
BufferedReader br = new BufferedReader(new InputStreamReader(is), BUFSIZE); 
while (true) {
    if (!br.ready()) {
        Thread.yield();
    }
    else {
        String line = br.readLine();
        if (line==null) break; // ここに移ることがあるのかすぐにわからない
        System.out.println(line); 
    }
} 



Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-06-12 14:16
> だっちょさん

掲載されたソースを使ってみたのですが、出力具合は変わりませんでした。
また、途中で必ずプログラムが止まります。

_________________


[ メッセージ編集済み 編集者: Tatsuya 編集日時 2007-06-12 14:24 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-06-12 14:31
snmpwalk だけで発生する現象でしょうか?
cat コマンドの出力をダンプしてみましたが特につっかかることはありませんでした。
固まっている瞬間にスレッドダンプをとってどの処理で止まっているのか確認してみてはいかがでしょう。

あと、子プロセスで呼び出さずに Java の中で処理してしまう方法もあります。
http://www.snmp4j.org/

[ メッセージ編集済み 編集者: インギ 編集日時 2007-06-12 14:32 ]
Tatsuya
ベテラン
会議室デビュー日: 2007/04/02
投稿数: 53
投稿日時: 2007-06-14 12:30
> インギさん

返答ありがとうございます。

制約上、今はとりあえずコマンドでやるということになってしまったので、今のところはパッケージを使用する予定はありません。

やはり、マルチスレッドにするしかないですかね。

スキルアップ/キャリアアップ(JOB@IT)