자바 호출 셸 명령 과 스 크 립 트 구현

1.소개
때때로 우 리 는 Linux 에서 자바 프로그램 을 실행 할 때 셸 명령 과 스 크 립 트 를 호출 해 야 한다.그리고 Runtime.getRuntime().exec()방법 은 우리 에 게 이 기능 을 제 공 했 고 Runtime.getRuntime()은 우리 에 게 다음 과 같은 몇 가지 exec()방법 을 제공 했다.

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 command, String[] envp) 
                     。 
Process exec(String command, String[] envp, File dir) 
                           。 
그 중에서 cmdarray 와 command 의 차이 가 많 지 않 습 니 다.또한 인자 에 envp 인자 가 없 거나 null 로 설정 되면 호출 명령 은 현재 프로그램 이 실행 하 는 환경 에서 실 행 될 것 임 을 표시 합 니 다.dir 인자 가 없 거나 null 로 설정 되 어 있 으 면 호출 명령 이 현재 프로그램 이 실행 중인 디 렉 터 리 에서 실 행 될 것 임 을 표시 합 니 다.따라서 다른 디 렉 터 리 에 있 는 파일 과 스 크 립 트 는 절대 경 로 를 사용 하 는 것 이 좋 습 니 다.매개 변수의 의미:
  • cmdarray:호출 명령 과 그 매개 변 수 를 포함 하 는 배열 입 니 다.
  • command:지정 한 시스템 명령 입 니 다.
  • envp:문자열 배열,그 중에서 각 요소 의 환경 변수의 설정 형식 은 name=value 입 니 다.하위 프로 세 스 가 현재 프로 세 스 의 환경 을 계승 해 야 한다 면 이 인 자 는 null 입 니 다.
  • dir:하위 프로 세 스 의 작업 디 렉 터 리;하위 프로 세 스 가 현재 프로 세 스 의 작업 디 렉 터 리 를 계승 해 야 한다 면 이 인 자 는 null 입 니 다.
  • 세심 한 독자 들 은 호출 작업 을 수행 하기 위해 JVM 이 Process 를 시작 하기 때문에 우 리 는 Process 류 를 호출 하 는 다음 과 같은 방법 을 통 해 호출 작업 이 정확하게 실행 되 는 지 알 수 있다.
    
    abstract int waitFor() 
            ,    ,        Process            。 
    
    
    프로 세 스 의 수출 값.관례 에 따라 0 은 정상 적 인 종 료 를 나타 낸다.그렇지 않 으 면 이상 한 실 패 를 의미한다.
    또한,일부 셸 명령 이나 스 크 립 트 를 호출 할 때 반환 값 이 있 습 니 다.이 반환 값 이나 출력 을 캡 처 하면?이 문 제 를 해결 하기 위해 Process 류 는 다음 과 같이 제공 했다.
    
    abstract InputStream getInputStream() 
             。           。
    
    
    2.셸 명령 호출
    문 제 를 설명 하기 위해 서 나 는 tar 명령 으로 만 시범 을 보 였 다.tar 명령 은 압축 하지 않 고 포장 하 는 명령 입 니 다.또한,tar 의 호출 이 정상적으로 실행 되 었 는 지 확인 하기 위해 서,나 는 waitFor()방법 을 호출 할 것 이다.
    
    private void callCMD(String tarName, String fileName, String... workspace){
     try {
     String cmd = "tar -cf" + tarName + " " + fileName;
    //      String[] cmd = {"tar", "-cf", tarName, fileName};
     File dir = null;
     if(workspace[0] != null){
      dir = new File(workspace[0]);
      System.out.println(workspace[0]);
     }
     process = Runtime.getRuntime().exec(cmd, null, dir);
    //     process = Runtime.getRuntime().exec(cmd);
     int status = process.waitFor();
     if(status != 0){
      System.err.println("Failed to call shell's command and the return status's is: " + status);
     }
     }
     catch (Exception e){
     e.printStackTrace();
     }
    }
    
    
    메모:명령 을 하나의 String[]에 넣 을 때 명령 의 모든 부분 을 하나의 요소 로 String[]에 존재 하거나 명령 을 빈 칸 문자 로 나 누 어 얻 은 String[]에 존재 해 야 합 니 다.
    
    String[] cmd = {"tar", "-cf", tarName, fileName}; //right
    String[] cmd = {"tar -cf", tarName, fileName};  //error
    
    dir 매개 변수의 역할 을 설명 하기 위해 서 저 는 이 자바 프로그램 과 포장 할 디 렉 터 리 hiv/를 다른 디 렉 터 리 에 두 었 습 니 다.
    
    /root/workspace/eclipse/Test/src/edu/wzm/CallShell.java
    /root/experiment/hive
    
    dir 를 설정 하지 않 거나 dir 를 null 로 설정 하지 않 으 면 fileName 은 상대 경로 일 수 밖 에 없습니다.절대 경로 가 좋 습 니 다.
    
    call.callCMD("/root/experiment/hive.tar", "/root/experiment/hive", null);
    // OR
    call.callCMD("/root/experiment/hive.tar", "/root/experiment/hive");
    
    만약 내 가 dir 를 설정 하여 hive 가 있 는 부모 디 렉 터 리 를 가리 키 면 훨씬 쉽다.
    
    call.callCMD("hive.tar", "hive", "/root/experiment/");
    
    3.셸 스 크 립 트 호출
    자바 가 셸 명령 을 호출 하 는 것 은 셸 스 크 립 트 를 호출 하 는 것 과 똑 같 습 니 다.나 는 여기에 다른 몇 가지 방면 을 소개 한다.
  • 스 크 립 트 에 매개 변 수 를 전달 합 니 다.
  • 호출 된 출력 결 과 를 캡 처 합 니 다.
  • envp 의 사용.
  • 스 크 립 트 에 파 라 메 터 를 전달 합 니 다.이 동작 은 간단 합 니 다.호출 명령 뒤에 파 라 메 터 를 추가 하여 String 이나 String[]을 구성 하 는 것 이 아 닙 니 다.
    호출 출력 정 보 를 캡 처 합 니 다.앞에서 도 Process.getInputStream()을 사용 한 적 이 있 습 니 다.단,입력 흐름 을 버퍼 링 하 는 것 이 좋 습 니 다:
    
    BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
    
    
    또한 envp 는 String[]이 고 String[]의 모든 요소 의 형식 은 name=value 입 니 다.예 를 들 어 나의 Linux 시스템 에는 다음 과 같은 환경 변수 가 없 지만,나 는 그것들 을 자바 코드 에 써 서 envp 로 한다.
    
    val=2
    call=Bash Shell
    
    내 가 호출 할 셸 스 크 립 트 는:/root/experiment/test.sh 입 니 다.
    
    #!/usr/bin/env bash
     
    args=1
    if [ $# -eq 1 ];then
     args=$1
     echo "The argument is: $args"
    fi
     
    echo "This is a $call"
    start=`date +%s`
    sleep 3s
    end=`date +%s`
    cost=$((($end - $start) * $args * $val))
    echo "Cost Time: $cost"
    
    자바 호출 코드 는:
    
    private void callScript(String script, String args, String... workspace){
     try {
     String cmd = "sh " + script + " " + args;
    //     String[] cmd = {"sh", script, "4"};
     File dir = null;
     if(workspace[0] != null){
      dir = new File(workspace[0]);
      System.out.println(workspace[0]);
     }
     String[] evnp = {"val=2", "call=Bash Shell"};
     process = Runtime.getRuntime().exec(cmd, evnp, dir);
    //      process = Runtime.getRuntime().exec(cmd);
     BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
     String line = "";
     while ((line = input.readLine()) != null) {
      System.out.println(line);
     }
     input.close();
     }
     catch (Exception e){
     e.printStackTrace();
     }
    }
     
    public static void main(String[] args) {
     // TODO Auto-generated method stub
     CallShell call = new CallShell();
     call.callScript("test.sh", "4", "/root/experiment/");
    }
    
    출력:
    /root/experiment/
    The argument is: 4
    This is a Bash Shell
    Cost Time: 24
    자바 호출 셸 명령 과 스 크 립 트 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 호출 셸 명령 과 스 크 립 트 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기