- PR -

Process.exec()メソッドについて

投稿者投稿内容
ヴォイコフ
会議室デビュー日: 2005/11/10
投稿数: 9
投稿日時: 2006-02-16 17:19
環境 *********************
OS:RedHatLinux 7.2
Tomcat:3.2.4
Apache:1.3.22
Java:IBM JDK1.3.0
**************************

お世話になっております。

サーバーから各クライアント端末(100台)にPINGを実行する為に、
Process.exec()メソッドを用いて"ping IPAddress -c 4"を
実行するプログラムを作成しています。
標準出力ストリームとエラー出力ストリームはそれぞれ個別のスレッドで
吐き出しているのですが、ごく稀にプロセスがダウンしてしまいますが、
Process.exec()自体に問題があるのでしょうか?

また、topコマンドでプロセスを監視していると、"zombie"状態になる瞬間があり、
すぐに復帰する状態が続きますが、何か関係があるのでしょうか?

ヴォイコフ
会議室デビュー日: 2005/11/10
投稿数: 9
投稿日時: 2006-02-16 20:26
*** 補足致します
>標準出力ストリームとエラー出力ストリームはそれぞれ個別のスレッドで
>吐き出しているのですが、ごく稀にプロセスがダウンしてしまいますが、
>Process.exec()自体に問題があるのでしょうか?
>また、topコマンドでプロセスを監視していると、"zombie"状態になる瞬間があり、
>すぐに復帰する状態が続きますが、何か関係があるのでしょうか?

断続的に"zombie"状態になるのはProcess.exec()のサブプロセスであるPINGプロセス
で、最終的にプロセスがダウンしてしまうのはJAVA自体です。
psコマンドで見ると、
 java[<defunct>]
 ping[<defunct>]
のようになっております。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-02-17 03:49
hs_err_pid<PID #>.log とか記録されてるならコレ
・BEA トラブルシューティング ガイド - バイナリ コア ファイルの分析
http://www.beasys.co.jp/cs/support_news/product_troubleshooting/System_Core_Pattern.html

されていないならコレ
・トラブルシューティング ガイド - コア ダンプが作成されない JVM クラッシュの調査
http://www.beasys.co.jp/cs/support_news/product_troubleshooting/JVM_Crash_wout_Dump_Pattern.html

が参考になるかもしれません。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-02-17 14:45
Runtime#exec()ですよね。

pingがゾンビになっているのは、waitFor()を実行していないからではないでしょうか。
javaがゾンビになるのはよくわかりませんが、意図した終了でないなら異常終了して
しまっているんですね、javaを起動したプロセスはjavaの終わりをwaitしてないので
しょうか?
あるいは親プロセスのクリーンアップ処理が終わる前の一瞬を捕らえたお話でしょうか?

という話はおいといて
pingを実行したいのであれば、外部コマンドを起動せずに、javaで実装されたpingを
呼び出したほうがいいですよ。
過去ログにjavaで実装したpingの話があります。
ってjniを使うんですね、それはそれで面倒ですが
Runtime#exec()はかなりコスト高いですよ。
プロセスがゾンビなるといった問題からも開放されます。
ヴォイコフ
会議室デビュー日: 2005/11/10
投稿数: 9
投稿日時: 2006-02-17 20:45
インギさん、progmanさん、有難うございます。

>pingがゾンビになっているのは、waitFor()を実行していないからではないでしょうか。
>javaがゾンビになるのはよくわかりませんが、意図した終了でないなら異常終了して
>しまっているんですね、javaを起動したプロセスはjavaの終わりをwaitしてないので
>しょうか?
>あるいは親プロセスのクリーンアップ処理が終わる前の一瞬を捕らえたお話でしょうか?

waitFor()は実行しております。親プロセスのクリーンアップ処理とは、execの
サブプロセスであるPINGの標準出力を吐き出すことでしょうか?
たしかに、ゾンビ状態になる瞬間はPINGの応答が出力されているときです。

コード抜粋 ========================
import java.io.*;

public class pingCheck {

public pingCheck() {
}

public boolean exec(String ipAddr) {
try {
boolean ans = false;
String ping = new String("ping ");
ping = ping + ipAddr + " -c 4";
System.out.println("ping " + ping);
// PING実行
Process proc = Runtime.getRuntime().exec(ping);
// PING実行結果
InputStream output = proc.getInputStream();
InputStream error = proc.getErrorStream();
// ストリーム出力スレッド生成
OutBuffReader out = new OutBuffReader(output);
OutErrBuffReader err = new OutErrBuffReader(error);
// ストリーム出力スレッド開始
out.start();
err.start();
// PING実行プロセス待機処理
proc.waitFor();
out.join();
err.join();
out = null;
err = null;
// 出力ストリームクローズ
output.close();
error.close();
// サブプロセスの破棄
proc.destroy();
return ans;
} catch(Exception e) {
System.out.println("pingCheck: " + e);
e.printStackTrace();
return false;
}
}
}
=====================================

また、javaがゾンビ状態になったときに、スレッドダンプを出力したいのですが、
親プロセス(PID(1)から発生したプロセス)に"kill" コマンドのQUITシグナルを
送っても出力できません。
そもそも、javaがゾンビになった時点で、pstreeコマンドでみると、
どれが親なのか分からなくなってしまいますが・・・
(元々親だったプロセスにシグナルを送ってもダメでした。)
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-02-20 15:27
>親プロセスのクリーンアップ処理とは
waitFor()の先でされるであろう処理のことです。
pingが終了して、waitFor()の先にあるシステムコール wait()が実行される間はゾンビ
になるでしょうし、それは問題ではありません。
これはpingがゾンビになる件についての話です。

javaはデーモンとして起動されているのでしょうね?
親がいないのでinitがクリーンアップするまでゾンビになるんではなかったかな?
起動の仕方や、なかでおこなっている処理にも依存するでしょう。


プロセス,UNIX,親プロセス,クリーンアップといったキーワードで検索すればいろいろ関連する情報は出てきます。
説明のベースはC言語です。

C言語でこういった処理を組み込むなら、まだわかるのですがjava VMを経由して、UNIXのプロセス管理、パイプといった機構を利用してもよくわからないとおもうのでpingの機能を実現するjavaクラス、メソッドの利用を薦めてるのですが

ping,java,icmpといったキーワードで検索したほうが、すんなりいきますよ。


ヴォイコフ
会議室デビュー日: 2005/11/10
投稿数: 9
投稿日時: 2006-02-20 17:47
progmanさん
有難うございます。

>javaはデーモンとして起動されているのでしょうね?
>親がいないのでinitがクリーンアップするまでゾンビになるんではなかったかな?
>起動の仕方や、なかでおこなっている処理にも依存するでしょう。

実はこの処理は、あるシステム中の一部で、どうやらバックグラウンドで動いている
もう一つのサーブレットのシステムと同時に動かしたときにプロセスがダウンして
しまうようで、exec(ping)単体ではゾンビにはなりますが、ダウンはしませんでした。
ダウンするのはもう一つの方に要因があるのかもしれません・・・

>C言語でこういった処理を組み込むなら、まだわかるのですがjava VMを経由して、
>UNIXのプロセス管理、パイプといった機構を利用してもよくわからないとおもうので
>pingの機能を実現するjavaクラス、メソッドの利用を薦めてるのですが
>ping,java,icmpといったキーワードで検索したほうが、すんなりいきますよ。

有難うございます。確かにおっしゃるとおりです。
しかし、そこまで変更することができないという現状がありまして・・・(汗




progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-02-20 18:43
ping実行はある程度運用の実績があるけど、Tomcatが落ちてしまうという問題があって、
再調査してる。
ということでしょうか?

>しかし、そこまで変更することができないという現状がありまして・・・(汗
はい、そういうことは多くありますし、何事も妥協は大事ですね。

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