본문 바로가기
Back-end/JAVA & Spring

[Java] 클래스 ProcessBuilder

by 꼬바리 2021. 5. 17.

java.lang.Object

->java.lang.ProcessBuilder

 

이 클래스는 OS 의 프로세스의 작성에 사용됩니다.

 ProcessBuilder인스턴스는 프로세스 속성의 컬렉션을 관리합니다. start() 메서드는 이러한 속성을 가지는 새로운 Process 인스턴스를 작성합니다. 같은 인스턴스로부터 start() 메서드를 반복해 호출해, 동일한 속성 또는 관련된 속성을 가지는 새로운 서브 프로세스를 작성할 수 있습니다.

 

각 프로세스빌더 는 다음의 프로세스 속성을 관리합니다.

  • 「커멘드」. 호출되는 외부 프로그램 파일과 그 인수 (존재하는 경우)를 나타내는 캐릭터 라인의 리스트입니다. 어느 캐릭터 라인 리스트가 유효한 OS 커멘드를 나타낼까는 시스템에 응해 다릅니다. 예를 들어 개념상의 인수가 리스트의 요소가 되는 것이 일반적입니다만, 프로그램이 커멘드 라인 캐릭터 라인 자체를 토큰화하는 것이 요구되는 OS가 있습니다. 이러한 시스템의 Java 구현에서는 정확하게 2개의 요소를 포함한 커멘드가 필요하게 되는 경우가 있습니다.
  • 「환경」. 환경은 「변수」로부터 「값」에의 시스템에 존재하는 매핑입니다. 초기값 는 현재의 프로세스의 환경의 카피입니다 (System.getenv()를 참조).
  • 「작업 디렉토리」. 기본값는 현재의 프로세스의 현재의 작업 디렉토리입니다. 보통, 이 디렉토리는 시스템 프로퍼티 user.dir로 이름을 붙일 수 있었던 디렉토리입니다.
  • redirectErrorStream 프로퍼티. 초기 상태에서는 이 프로퍼티는 false 입니다. 즉, 서브 프로세스의 표준 출력과 에러 출력은 2개의 독립한 스트림에 송신됩니다. 이러한 출력에는 Process.getInputStream() 메서드와 Process.getErrorStream() 메서드를 사용해 액세스 할 수 있습니다. 이 값을 true로 설정하면, 표준 에러는 표준 출력에 머지 됩니다. 머지 하면, 대응하는 출력을 포함한 에러 메세지와의 상관을 나타내는 것이 용이하게 됩니다. 이 경우 머지 된 데이터는 Process.getInputStream() 가 돌려주는 스트림로부터 읽어낼 수가 있습니다만, Process.getErrorStream() 가 돌려주는 스트림을 읽어내면, 파일의 마지막에 곧 달합니다.

프로세스빌더 의 속성을 변경하면, 속성을 변경한 객체의 start() 메서드로 그 이후 시작되는 프로세스에 영향이 있습니다만, 그 이전에 시작된 프로세스나 Java 프로세스 자체에는 영향 없습니다.

 

대부분의 에러 체크는 start() 메서드로 실행됩니다. start() 가 실패하도록, 객체 상태를 변경할 수 있습니다 . 예를 들어 커멘드 속성을 비어있는 리스트로 설정하면, start() 가 불려가 지 않는 이상 예외는 Throw 되지 않습니다.

 

이 클래스는 동기화 되지 않습니다. 복수의 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();

환경 변수의 명시적 세트를 가지는 프로세스를 시작하려면, 우선 Map.clear()를 호출하고 나서, 환경 변수를 추가합니다.


생성자 개요
ProcessBuilder (List <String > command)
          지정된 OS 프로그램과 인수를 가지는 프로세스빌더 를 구축합니다.
ProcessBuilder (String ... command)
          지정된 OS 프로그램과 인수를 가지는 프로세스빌더 를 구축합니다.

 

메서드 개요
 List <String > command ()
          프로세스빌더 의 OS 프로그램과 인수를 리턴합니다.
 ProcessBuilder command (List <String > command)
          프로세스빌더 의 OS 프로그램과 인수를 설정합니다.
 ProcessBuilder command (String ... command)
          이 프로세스빌더 의 OS 프로그램과 인수를 설정합니다.
 File directory ()
          이 프로세스빌더 의 작업 디렉토리를 리턴합니다.
 ProcessBuilder directory (File  directory)
          이 프로세스빌더 의 작업 디렉토리를 설정합니다.
 Map <String, String > environment ()
          이 프로세스빌더 의 환경의 캐릭터 라인 맵의 뷰를 리턴합니다.
 boolean redirectErrorStream ()
          이 프로세스빌더가 표준 에러와 표준 출력을 머지 할지 어떨지를 판정합니다.
 ProcessBuilder redirectErrorStream (boolean redirectErrorStream)
          이 프로세스빌더 의 redirectErrorStream 프로퍼티를 설정합니다.
 Process start ()
          이 프로세스빌더 의 속성을 사용해 새로운 프로세스를 시작합니다.

 

클래스 java.lang. Object 로부터 상속된 메서드
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 


생성자 상세

ProcessBuilder

public ProcessBuilder(List <String > command)

 

지정된 OS 프로그램과 인수를 가지는 프로세스빌더 를 구축합니다. 이 생성자는 command 리스트의 복사본을 작성하지 않습니다. 이후의 리스트의 갱신은 프로세스빌더 상태에 반영됩니다. command가 유효한 OS 커멘드에 대응할지 어떨지는 체크되지 않습니다.

 

파라미터:command - 프로그램과 프로그램의 인수를 포함한 리스트

예외:NullPointerException - 인수가 null인 경우


ProcessBuilder

public ProcessBuilder(String ... command)

 

지정된 OS 프로그램과 인수를 가지는 프로세스빌더 를 구축합니다. 이 생성자는 command 배열과 같은 캐릭터 라인을 포함한 캐릭터 라인 리스트에 프로세스빌더 의 커멘드를 같은 순서로 설정하는 간이 생성자 입니다. command가 유효한 OS 커멘드에 대응할지 어떨지는 체크되지 않습니다.

 

파라미터:command - 프로그램과 프로그램의 인수를 포함한 캐릭터 라인 배열


메서드의 상세

command

public ProcessBuilder command(List <String > command)

 

프로세스빌더 의 OS 프로그램과 인수를 설정합니다. 이 메서드는 command 리스트의 복사본을 작성하지 않습니다. 이후의 리스트의 갱신은 프로세스빌더 상태에 반영됩니다. command가 유효한 OS 커멘드에 대응할지 어떨지는 체크되지 않습니다.

 

파라미터:command - 프로그램과 프로그램의 인수를 포함한 리스트

반환값:프로세스빌더

예외:NullPointerException - 인수가 null인 경우


command

public ProcessBuilder command(String ... command)

 

이 프로세스빌더 의 OS 프로그램과 인수를 설정합니다. 이 생성자는 command 배열과 같은 캐릭터 라인을 포함한 캐릭터 라인 리스트에 커멘드를 같은 순서로 설정하는 간이 메서드입니다. command가 유효한 OS 커멘드에 대응할지 어떨지는 체크되지 않습니다.

 

파라미터:command - 프로그램과 프로그램의 인수를 포함한 캐릭터 라인 배열

반환값:이 프로세스빌더


command

public List <String > command()

 

프로세스빌더 의 OS 프로그램과 인수를 리턴합니다. 리턴된 리스트는 카피가 아닙니다. 이후의 리스트의 갱신은 프로세스빌더 상태에 반영됩니다.

 

반환값:프로세스빌더 의 프로그램과 프로그램의 인수


environment

public Map <String, String > environment()

 

이 프로세스빌더 의 환경의 캐릭터 라인 맵의 뷰를 리턴합니다. 프로세스빌더가 작성될 때마다, 환경은 현재의 프로세스 환경의 카피에 초기화됩니다 (System.getenv()를 참조). 이 객체의 start() 메서드로 시작되는 이후의 서브 프로세스는 이 맵을 환경으로서 사용합니다.

 

리턴된 객체는 보통 Map 오퍼레이션을 사용해 변경할 수 있습니다. 이러한 변경은, start() 메서드를 사용해 시작된 서브 프로세스로 가시입니다. 2개의 ProcessBuilder인스턴스는 항상 독립한 프로세스 환경을 가지고 있습니다. 이 때문에 리턴된 맵은 다른 ProcessBuilder인스턴스나, System.getenv 로 리턴된 값에 반영될 것은 없습니다.

 

시스템이 환경 변수를 지원 하고 있지 않는 경우는 비어있는 맵이 리턴됩니다 .

 

리턴된 맵은 null 키나 값을 허용 하지 않습니다. null 키나 값을 삽입하거나 이것들이 있는지 조회하면, NullPointerException을 발생시킵니다. String 형이 아닌 키나 값이 있는지 조회하면, ClassCastException을 발생시킵니다.

 

리턴된 맵의 동작은 시스템에 의존합니다. 환경 변수의 변경을 허가하지 않는 시스템이 있으면, 특정의 변수명이나 값이 금지되는 시스템도 있습니다. 이 이유로부터, OS 로 변경이 허가되어 있지 않은 경우, 맵을 변경하려고 하면, UnsupportedOperationException  IllegalArgumentException 로 실패할 가능성이 있습니다.

 

환경 변수명과 환경 변수의 값의 외부 형식은 시스템에 존하므로 환경 변수명과 환경 변수의 값과 Java Unicode 캐릭터 라인과의 사이에 1 대 1 매핑 관계가 없을 가능성이 있습니다. 그 경우에서도, Java 코드로 변경되어 있지 않은 환경 변수가 서브 프로세스에서도 변경되어 있지 않은 네이티브인 표현을 가지도록 맵은 구현됩니다.

 

리턴된 맵과 그 코레크션뷰는 Object.equals(java.lang.Object) 메서드와 Object.hashCode() 메서드의 범용 규약에 따르지 않을 가능성이 있습니다.

 

리턴된 맵은 일반적으로 모든 플랫폼에서 대문자와 소문자를 구별합니다.

 

시큐러티 매니저가 존재하는 경우는 RuntimePermission ("getenv. *") 접근 권한을 사용해 checkPermission 메서드가 호출됩니다. 이 결과, SecurityException이 발생되는 일이 있습니다.

 

Java 서브 프로세스에 정보를 건네주는 경우, 환경 변수보다시스템 프로퍼티가 추천 되고 있습니다.

 

반환값:이 프로세스빌더 의 환경

예외:SecurityException - 시큐러티 매니저가 존재해, checkPermission 메서드가 프로세스 환경에의 액세스를 허가하지 않을 때

관련 항목:Runtime.exec(String[], String[], java.io.File), System.getenv()


directory

public File directory()

 

이 프로세스빌더 의 작업 디렉토리를 리턴합니다.이 이후, 이 객체의 start() 메서드에 의해 시작된 서브 프로세스는 이 디렉토리를 작업 디렉토리로서 사용합니다. 리턴된 값은, null 가능성이 있습니다. 이것은 현재의 Java 프로세스의 작업 디렉토리 (일반적으로 user.dir 시스템 프로퍼티로 지정된 디렉토리)를 child process의 작업 디렉토리로서 사용하는 것을의미합니다.

 

반환값:이 프로세스빌더 의 작업 디렉토리


directory

public ProcessBuilder directory(File  directory)

 

이 프로세스빌더 의 작업 디렉토리를 설정합니다.이 이후, 이 객체의 start() 메서드로 시작된 서브 프로세스는 이 디렉토리를 작업 디렉토리로서 사용합니다. 인수는 null 가능성이 있습니다. 이것은 현재의 Java 프로세스의 작업 디렉토리 (일반적으로 user.dir 시스템 프로퍼티로 지정된 디렉토리)를 child process의 작업 디렉토리로서 사용하는 것을의미합니다.

 

파라미터:directory - 새로운 작업 디렉토리

반환값:이 프로세스빌더


redirectErrorStream

public boolean redirectErrorStream()

 

이 프로세스빌더가 표준 에러와 표준 출력을 머지 할지 어떨지를 판정합니다.

이 프로퍼티가 true인 경우, 이 객체의 start() 메서드로 그 이후 시작된 서브 프로세스에 의해 생성되는 에러 출력은 표준 출력과 머지 됩니다. 이것에 의해 Process.getInputStream() 메서드를 사용해, 에러 출력과 표준 출력의 양쪽 모두를 읽어낼 수가 있습니다. 머지에의해 에러 메세지와 대응하는 출력과의 상관을 나타내는 것이 용이하게 됩니다. 초기값 는 false 입니다.

 

반환값:이 프로세스빌더 의 redirectErrorStream 프로퍼티


redirectErrorStream

public ProcessBuilder redirectErrorStream(boolean redirectErrorStream)

 

이 프로세스빌더 의 redirectErrorStream 프로퍼티를 설정합니다.

이 프로퍼티가 true인 경우, 이 객체의 start() 메서드로 그 이후 시작된 서브 프로세스에 의해 생성되는 에러 출력은 표준 출력과 머지 됩니다. 이것에 의해 Process.getInputStream() 메서드를 사용해, 에러 출력과 표준 출력의 양쪽 모두를 읽어낼 수가 있습니다. 머지에의해 에러 메세지와 대응하는 출력과의 상관을 나타내는 것이 용이하게 됩니다. 초기값 는 false 입니다.

 

파라미터:redirectErrorStream - 새로운 프로퍼티의 값

반환값:이 프로세스빌더


start

public Process start() throws IOException

 

이 프로세스빌더 의 속성을 사용해 새로운 프로세스를 시작합니다.

 

이 새로운 프로세스는 directory() 로 지정된 작업 디렉토리의, environment() 로 지정된 프로세스 환경을 가지는 command() 로 지정된 커멘드와 인수를 호출합니다.

 

이 메서드는 커멘드가 유효한 OS 커멘드인 것을 체크합니다. 어느 커멘드가 유효한가 어떤가는 시스템 존입니다만, 커멘드는 적어도 null 이외의 캐릭터 라인의 비어있지 않은 리스트가 아니면 안됩니다.

 

시큐러티 매니저가 존재하는 경우는 command 배열의 최초의 컴퍼넌트를 인수로서 사용해 checkExec 메서드가 호출됩니다. 이 결과, SecurityException이 발생되는 일이 있습니다.

 

OS 프로세스의 시작은 지극히 시스템에 의존합니다. 발생할 가능성이 있는 불편은 다음과 같습니다.

  • OS 프로그램 파일이 발견되지 않았다
  • 프로그램 파일에의 접근 권한이 거부되었다
  • 작업 디렉토리가 존재하지 않는다

이상의 케이스에서는 예외가 발생 됩니다. 예외의 정확한 특성은 시스템에 의존합니다만, 예외는 항상 IOException 서브 클래스가 됩니다.

 

이 프로세스빌더에 의 이후의 변경은 리턴된 Process에 영향을 미치지 않습니다.

 

반환값:서브 프로세스를 관리하기 위한 새로운 Process 객체

예외:NullPointerException - 커멘드 리스트의 요소가 null인 경우

IndexOutOfBoundsException - 커멘드가 비어있는 (사이즈가 0)의 리스트의 경우

SecurityException - 시큐러티 매니저가 존재해, checkExec 메서드가 서브 프로세스의 작성을 허가하지 않는 경우

IOException - 입출력 에러가 발생했을 경우

관련 항목:Runtime.exec(String[], String[], java.io.File), SecurityManager.checkExec(String)

728x90
반응형

댓글