- PR -

RunTime#exec(String)で起動したネイティブコマンドがスリープする

1
投稿者投稿内容
mine
会議室デビュー日: 2002/10/25
投稿数: 9
投稿日時: 2003-07-07 15:09
はじめまして。

RunTime#exec(String)でネイティブコマンドを起動して
Process#waitFor()で終了を待っていると
ネイティブコマンドがスリープしていることがあります。
psコマンドでみるとネイティブコマンドがスリープしています。

いつも必ず発生するというわけではなく、発生しないときもあります。
ただ発生するコマンドの場合はいつも発生します。
コマンドの標準出力に出力するサイズが関係しているように思えます。

サンプルコード
Process proc = RunTime.getRuntime().exec(cmd);
proc.waitFor();

OS:RedHat Linux 7.3
JDK:1.4.03

どなたかスリープしないようにする方法をご存知のかたはいらしゃいませんでしょうか。
よろしくお願いします。
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2003-07-07 20:03
引用:

psコマンドでみるとネイティブコマンドがスリープしています。

いつも必ず発生するというわけではなく、発生しないときもあります。
ただ発生するコマンドの場合はいつも発生します。
コマンドの標準出力に出力するサイズが関係しているように思えます。


その推測はおそらく当たりです。標準出力のバッファが一杯になってwriteが
ブロックしてるんです。

別のスレッドから吸い出してやると良いかもしれません。
mine
会議室デビュー日: 2002/10/25
投稿数: 9
投稿日時: 2003-07-08 08:38
回答ありがとうございます。

いろいろ試してみました。
以下のようにファイルにリダイレクトしても同じでした。

Process proc = RunTime.getRuntime().exec(cmd + " > debug.log");
proc.waitFor();

以下のようにシェルプログラムを書いてcmdをシェルで実行しファイルにリダイレクトすると
期待通りに動作しました。

String shell = "test.csh";
Process proc = RunTime.getRuntime().exec(shell);
proc.waitFor();

test.csh内でcmdをファイルにリダイレクトする。


これで対応はできるのですが、いろいろ試しているときに
OS:Vine Linux 1.1
JDK:JDK1.1.7
の環境では一番最初のコードで動作しました。


> 標準出力のバッファが一杯になってwriteが
> ブロックしてるんです。

という問題はJDKのバージョンアップにより発生したものなのでしょうか?
1

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