2011년 6월 13일 월요일

JDK 5.0에서의 Process 실행의 새로운 방식 ProcessBuilder

Runtime.exec 메서드를 이용한 기존 방식
java.lang.Runtime 클래스의 대표 메서드
int availableProcessors ()Java 가상 머신이 사용 가능한 프로세서의 수를 돌려줍니다.(OS의 커널 파라이터와 연관됩니다.)
Process exec (String command)지정된 캐릭터 라인 커멘드를, 독립한 프로세스로 실행합니다.
Process exec (String [] cmdarray)지정된 커멘드와 인수를, 독립한 프로세스로 실행합니다.
Process exec (String [] cmdarray, String [] envp)지정된 커멘드와 인수를, 지정된 환경을 가지는 독립한 프로세스로 실행합니다.
Process exec (String [] cmdarray, String [] envp, File dir)지정된 커멘드와 인수를, 지정된 환경과 작업 디렉토리를 가지는 독립한 프로세스로 실행합니다.
Process exec (String cmd, String [] envp)지정된 캐릭터 라인 커멘드를, 지정된 환경을 가지는 독립한 프로세스로 실행합니다.
Process exec (String command, String [] envp, File dir)지정된 캐릭터 라인 커멘드를, 지정된 환경과 작업 디렉토리를 가지는 독립한 프로세스로 실행합니다.
void exit (int status)현재 실행하고 있는 Java 가상 머신을, Shutdown 순차 순서를 개시해 종료합니다.
long freeMemory ()Java 가상 머신내의 여유 메모리의 양을 돌려줍니다.
void gc ()가비지콜렉터를 실행합니다.
static Runtime getRuntime ()현재의 Java 어플리케이션에 관련한 Runtime 오브젝트를 돌려줍니다.
void halt (int status)현재 실행중의 Java 가상 머신을 강제 종료합니다.
long maxMemory ()Java 가상 머신이 사용을 시도하는 최대 메모리 용량을 돌려줍니다.
long totalMemory ()Java 가상 머신의 메모리의 총용량을 돌려줍니다.


Sample Program
package test.processbuilder;
import java.io.*;
import java.util.*;
public class RuntimeMain {
/**
* USE : Windows java test.processbuilder.RuntimeMain cmd /c dir
* Linux&Unix java test.processbuilder.RuntimeMain ls
* @param args
* @throws IOException
*/
public static void main(String args[])
throws IOException {
if (args.length <= 0) {
System.err.println("Need command to run");
System.exit(-1);
}
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(args);
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}


ProcessBuilder를 이용한 방식
각 ProcessBuilder 인스턴스는, 프로세스 속성의 콜렉션을 관리한다. start() 메소드는, 이러한 속성을 가지는 신규 Process 인스턴스를 작성한다. 같은 인스턴스로부터 start() 메소드를 반복 호출해, 동일한 속성 또는 관련하는 속성을 가지는 신규 서브 프로세스를 작성할 수 있는게 장점이다.
이 클래스는 동기화 되어 있지 않기 때문에 복수의 thread가 ProcessBuilder 인스턴스에 동시에 액세스 해, 적어도 1 개의 thread가 구조적으로 1 개의 속성을 변경했을 경우, 변경된 속성은 외부에서 필히 동기화 되어있어야 한다.
사용 예
Process p = new ProcessBuilder("myCommand", "myArg"). start();

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
Map<String, String>
env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");
Process p = pb.start();


java.lang.ProcessBuilder 클래스의 대표 메서드
ProcessBuilder (List <String > command)지정된 operating system 프로그램과 인수를 가지는 ProcessBuilder를 구축합니다.
ProcessBuilder (String ... command)지정된 operating system 프로그램과 인수를 가지는 ProcessBuilder를 구축합니다.
List <String > command ()ProcessBuilder의 operating system 프로그램과 인수를 돌려줍니다.
ProcessBuilder command (List <String > command)이 ProcessBuilder의 operating system 프로그램과 인수를 설정합니다.
ProcessBuilder command (String ... command)이 ProcessBuilder의 operating system 프로그램과 인수를 설정합니다.
File directory ()이 ProcessBuilder의 작업 디렉토리를 돌려줍니다.
ProcessBuilder directory (File directory)이 ProcessBuilder의 작업 디렉토리를 설정합니다.
Map <String ,String > environment ()이 ProcessBuilder의 환경의 캐릭터 라인 맵의 뷰를 돌려줍니다.
boolean redirectErrorStream ()이 ProcessBuilder가 표준 에러와 표준 출력을 머지 할지 어떨지를 판정합니다.
ProcessBuilder redirectErrorStream (boolean redirectErrorStream)이 ProcessBuilder의 redirectErrorStream 프로퍼티를 설정합니다.
Process start ()이 ProcessBuilder의 속성을 사용해 신규 프로세스를 기동합니다.


Sample Program
package test.processbuilder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
public class ProcessBuilderMain {
/**
* USE : Windows java test.processbuilder.ProcessBuilderMain cmd /c dir
* Linux&Unix java test.processbuilder.ProcessBuilderMain ls
* @param args
* @throws IOException
*/
public static void main(String args[])
throws IOException {
if (args.length <= 0) {
System.err.println("Need command to run");
System.exit(-1);
}
Process process = new ProcessBuilder(args).start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:",Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...