- - PR -
Runtime#execにてWindows2003 Server上で実行出来ないコマンド
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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を試したところ同じような 現象が起きたが解決した、という方はおられませんでしょうか。。。 もしくは、他に原因があると推測できる個所があれば、ご助言をいただけますでしょうか。 よろしくお願いいたします。 |
|
投稿日時: 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 |
|
投稿日時: 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などで作るしか ないかな・・・と思っています。 |
|
投稿日時: 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 これが原因の本命のような気がします。 とりあえず、当ててみます・・・。 |
|
投稿日時: 2005-06-10 16:57
yenjeansFunです。すみません。自己解決しました。
Windows2003 ServerにSPを当てていなかったのが原因でした。 お騒がせしました・・・。 |
1