Interstage Application Server 使用上の注意 - Solaris (TM) Operating Environment -
目次 前ページ次ページ

第3章 注意事項> 3.16 JDK/JREの注意事項

3.16.6 java.lang.Runtime.exec()使用時の注意事項

java.lang.Runtime.exex()で、別プログラムを実行する際の注意事項を、以下で説明します。

■プログラム終了後の後処理

Runtime.exec()で別プログラムを実行する場合、別プログラムの実行後にjava.lang.Processインスタンスに対してdestroy()を実行して、資源を回収できるようにしてください。destroy()を実行しない場合、資源が回収されず、メモリ不足の原因になる場合があります。

次の例を参考にして、プログラミングしてください。

Process.destroy()の実行例

Process p = Runtime.getRuntime().exec("xxx");
    :
p.waitFor();    // プロセスが終了するまで待機する
p.destroy();    // プロセスを明示的に終了させ、資源を回収できるようにする

仮想メモリが不足している状態でRuntime.exec()を実行するとjava.io.IOExceptionが発生する場合があります。この場合は、仮想メモリを増やすか、javaコマンドの"-Xmx"オプションなどでJavaヒープの最大サイズを小さくして対処してください。

■子プロセスのストリームに対する入出力

親プロセスがRuntime.execメソッドで子プロセスを実行する際、子プロセスの標準入力、標準出力、標準エラー出力のそれぞれに対してパイプを作成します。
このため、子プロセスが、標準入力からの入力を待っている状態になったり、標準出力および標準エラー出力へ出力できなかい状態になったりした場合、子プロセス自身の処理が進まず、子プロセスがブロックされるか、デッドロックになる場合があります。

したがって、子プロセスの標準入力への書込みおよび、標準出力、標準エラー出力からの読込みを行う処理を確実に迅速に行うようにしてください。

次の例を参考にして、プログラミングしてください。

子プロセスの標準出力、標準エラー出力に対する入力処理の例

import java.io.*;

public class ProcessSample {
    public static void main(String[] args) {
        new ProcessSample();
    }

    public ProcessSample() throws Exception {
        // "sort data.txt"を、子プロセスとして実行
        // sortは、テキストをソートするコマンド
        // data.txtは、javaプロセスのカレントディレクトリ上のテキストファイル
        Process p = Runtime.getRuntime().exec("sort data.txt");

        // 子プロセスの標準出力および標準エラー出力を入力するスレッドを起動
        new StreamThread(p.getInputStream(), "stdout.txt").start();
        new StreamThread(p.getErrorStream(), "stderr.txt").start();

        p.waitFor();  // 子プロセスの終了を待つ
        p.destroy();  // 子プロセスの明示的に終了させ、資源を回収できるようにする
    }

    /**
     *子プロセスの出力ストリームから入力し、ファイルに出力するスレッド
     */
    class StreamThread extends Thread {
        private static final int BUF_SIZE = 4096;
        private InputStream in;
        private BufferedOutputStream out;

        public StreamThread(InputStream in, String outputFilename) throws IOException {
            this.in  = in;
            this.out = new BufferedOutputStream(new FileOutputStream(outputFilename));
        }

        public void run(){
            byte[] buf = new byte[BUF_SIZE];
            int size = -1;
            try{
                while((size = in.read(buf, 0, BUF_SIZE)) != -1){
                    out.write(buf, 0, size);
                }
            }catch(IOException ex){
                ex.printStackTrace();
            }finally{
                try{in.close();} catch(IOException ex){}
                try{out.close();}catch(IOException ex){}
            }
        }
    }
}

目次 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005