- PR -

Runtime#execにてWindows2003 Server上で実行出来ないコマンド

1
投稿者投稿内容
yenjeansFun
会議室デビュー日: 2005/06/10
投稿数: 4
投稿日時: 2005-06-10 12:08
はじめて投稿いたします、yenjeansFunと申します。

既に別の方が投稿されている
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5759&forum=12
と同じような内容なのですが、
私の場合、この方と同じ方法を試してみてもうまくいかないため、
投稿させていただきました。

【目的】
・Windows2003 Server上で動作しているServletから、別Unix上のプログラム
に対してrshコマンドを投げて実行、処理結果を取得したい。

【問題のプログラム】

//////////////////////////////////////////////////////////////////////
//rsh実行
//////////////////////////////////////////////////////////////////////
private static boolean execRsh(String prm_rhost, String prm_command,
Vector prm_results) {

String result = "";

// Runtime のインスタンスを作成
Runtime rt = Runtime.getRuntime();

// rshコマンド発行
try {
Process p = null;
p = rt.exec( "cmd /c rsh "+prm_rhost+" \""+prm_command+"\"" );
// コマンドのエラー結果を受け取る。
BufferedReader bre = new BufferedReader( new InputStreamReader(p.getErrorStream() ) );
if ( (result = bre.readLine()) != null ){
TestLogOut(LogPath,ML_LOG_NAME,"AddMailAccount : rshコマンド失敗 : "+prm_command+" : 結果 : "+result);
while( (result = bre.readLine()) != null ){
TestLogOut(LogPath,ML_LOG_NAME,"AddMailAccount : rshコマンド失敗 : "+prm_command+" : 結果 : "+result);
}
bre.close();
return false;
}
bre.close();
prm_results.clear();
//結果配列の初期化
BufferedReader bri = new BufferedReader( new InputStreamReader(p.getInputStream() ) );
// コマンドの実行結果を受け取る。
while( (result = bri.readLine()) != null ){
prm_results.addElement(result);
}
bri.close();
p.waitFor();
p = null;
}catch(IOException e) {
e.printStackTrace();
return false;
}catch(InterruptedException e) {
e.printStackTrace();
return false;
}/*finally {
System.out.println("end");
}*/

return true;
}



【エラーが起きる環境】
◆OS◆
Windows2003 Server(SPなし)
◆JDK◆
JDK1.4.2_08

【エラーの内容】
上記の
if ( (result = bre.readLine()) != null ){
にて固まってしまう。
(別Unix上のプログラムはrshコマンドを受けて動作、
正常終了しているにも関わらず、rshコマンドを発行
したServlet側は結果を受け取る際に固まってしまう)

【エラーが起きない環境】
WindowsNT SP6
◆JDK◆
JDK1.3.1_04

OSをWindowsNTからWindows2003 Serverにしたところ、
従来、動作していたrshコマンド発行処理が固まるように
なってしまいました。

・Windows2003 Serverは変えずに、
JDK1.4.2_08を、従来動作していた同じJDK1.3.1_04に
しても現象は変わらず。

・上記rshコマンドを、Servletでなく、直接、Windows2003 Server
のDOS窓から実行すると正常動作する。
処理結果も、標準出力として正常に表示される。

・p = rt.exec( "cmd /c rsh "+prm_rhost+" \""+prm_command+"\"" );
のコマンド記述部分を、Stringでなく、String配列として記述し直して
試しても結果は変わらず。

・Process p = null;
p = rt.exec( "cmd /c rsh "+prm_rhost+" \""+prm_command+"\"" );
p.waitFor();
// コマンドのエラー結果を受け取る。
BufferedReader bre = new BufferedReader( new InputStreamReader(p.getErrorStream() ) );

とした場合は、p.waitFor();
の時点で固まる。

・別サイトの情報に、
Java プログラム側でコマンドの出力を読み出していないと、
バッファがいっぱいになり、外部コマンドがその出力待ちで
途中で止まることが有るとの記述があり、回避策として
Process#getInputStream() と Process#getErrorStream() で
得られるストリームからコマンドの出力を読み出すようにすれ
ば良いとあったが、
別の方が投稿されている
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5759&forum=12
も同じ方法を試して解決されており、同様の方法を試してみたが
現象は変わらず。


・・・調査してみまして、動作環境が原因ではないかとの推測はあるのですが・・・。
どなたか、Windows2003 ServerにてRuntime#execを試したところ同じような
現象が起きたが解決した、という方はおられませんでしょうか。。。

もしくは、他に原因があると推測できる個所があれば、ご助言をいただけますでしょうか。
よろしくお願いいたします。
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2005-06-10 13:00
Runtime#execは結構バグが多いのですが、
このあたりではないでしょうか?

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4109888

1.5.0でもfixされていないようですが。
http://java.sun.com/j2se/1.5.0/fixedbugs/fixedbugs.html
yenjeansFun
会議室デビュー日: 2005/06/10
投稿数: 4
投稿日時: 2005-06-10 14:21
ご返答、ありがとうございます。yenjeansFunです。

Runtime#execにバグが多いのは、他投稿にも記述されていたので
わかったはいたのですが・・・1.5.0でもfixされていないんですね。。

現在の調査状況ですが、Windows2003 Server のタスクマネージャーを
見て気付いたのですが、Serlvetからrshコマンドを投げた場合は、
System32ディレクトリ以下にあるRSH関連のexeが処理途中で停止している
ようです。
(停止しているので、タスクマネージャーにRSH関連のexeが沢山、溜まっていく)
タスクマネージャーでRSHのプロセスを終了させてやると、Servlet側の金縛りが
解けてその後の処理が正常に流れるようです。

マイクロソフトのサポートセンターに確認してみたところ、
どうもWindows2003 Server固有の問題のような気配です。

この後も調査を続けて、Java側の問題でなくOSの問題でサポセンから提供される
パッチなどを当てても解決しないようであれば、最悪、RSHのプロセスを常に見張って、
固まったと判断したらプロセスを自動終了させるバッチをVBなどで作るしか
ないかな・・・と思っています。
yenjeansFun
会議室デビュー日: 2005/06/10
投稿数: 4
投稿日時: 2005-06-10 15:07
yenjeansFunです。問題と思われるマイクロソフトのページです。

http://support.microsoft.com/default.aspx?scid=kb;ja;827538
http://support.microsoft.com/default.aspx?scid=kb;ja;830740

これが原因の本命のような気がします。
とりあえず、当ててみます・・・。
yenjeansFun
会議室デビュー日: 2005/06/10
投稿数: 4
投稿日時: 2005-06-10 16:57
yenjeansFunです。すみません。自己解決しました。

Windows2003 ServerにSPを当てていなかったのが原因でした。

お騒がせしました・・・。
1

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