- PR -

Runtimeクラスでの連結コマンドの実行について(Linux)

1
投稿者投稿内容
Piro
常連さん
会議室デビュー日: 2006/03/28
投稿数: 31
投稿日時: 2006-03-29 14:35
RuntimeクラスからLinuxのコマンドを実行しようとしています。
単一のコマンド、例えば「ls -l」や「ps -ef」などは問題無く実行できるのですが、
これらをパイプ「"|"」で連結させた場合、例えば「ps -ef | grep java」のような
コマンドが実行できません。
そもそもRuntimeクラスからはパイプを使って連結されたコマンドは実行できないのでしょうか?
ご教授いただける方がいらっしゃいましたら、よろしくお願いします。

ちなみに以下のコーディングで確認しています。
--------
Process process = Runtime.getRuntime().exec("ps -ef | grep java");

// 外部コマンドの標準出力を取得するための入力ストリームを取得
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));

// 標準出力を1行づつ取り出し
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-03-29 14:48
 パイプやリダイレクションなどのシェルが解釈しているものは、
そのままではRuntime#execで使用できません。
 シェルを介して実行する必要があるようです。

コード:
String[] cmdarray = {"/bin/sh", "-c", "ls > list"};
runtime.exec(cmdarray);



 上記はlsコマンドのものですが、改変すればpsコマンドも実行
できるのではないでしょうか。
(JavaFAQ:http://javafaq.jp/S103.htmlより)
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-03-29 15:00
回答ではありませんが、java.lang.Runtime#execを実行したらProcess#waitForを使って処理が終わるまで待つようにした方がいいですよ。
Piro
常連さん
会議室デビュー日: 2006/03/28
投稿数: 31
投稿日時: 2006-03-29 16:37
引用:

悠さんの書き込み (2006-03-29 14:48) より:
 上記はlsコマンドのものですが、改変すればpsコマンドも実行
できるのではないでしょうか。
(JavaFAQ:http://javafaq.jp/S103.htmlより)



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

>>悠さん
psでも同様に実行できました。
大変参考になりました。ありがとうございました。

>>想馬さん
ご指摘ありがとうございます。
どこかでは呼ばないととは思っていたのですが、抜けたままでした。
exec()の後に追記するようにします。


1

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