자바 프로그램 에서 리 눅 스 명령 실행(JSP 에서 다른 프로그램 실행)

9659 단어 링크 ux 명령
자바 프로그램 에서 Liux 명령 을 실행 하려 면 주로 두 가지 종류 에 의존 합 니 다:Process 와 Runtime
우선 Process 클래스 를 살 펴 보 겠 습 니 다.
ProcessBuilder.start()   Runtime.exec           ,    Process        ,                 。
Process 、 、 、 ( ) 。 , , , ,Microsoft Windows Win16
/DOS , shell 。 。 io( stdin、stdout stderr) (getOutputStream()、getInputStream() getErrorStream()) 。 。 , , , 。 Process , , 。 Process Java , Process 。

특히 주의해 야 할 것 은:
1.만 든 하위 프로 세 스 는 자신의 터미널 콘 솔 이 없 으 며 모든 레이 블 작업 은 세 개의 흐름 을 통과 합 니 다.
(getOutputStream(),getInputStream(),getErrorStream()을 부모 프로 세 스 로 재 설정 합 니 다.(부모 프로 세 스 는 이 흐름 을 통 해 하위 프로 세 스 의 실행 상황 을 판단 할 수 있 습 니 다)
2.일부 이 플랫폼 은 표준 입력 과 출력 흐름 에 만 제 한 된 버퍼 크기 를 제공 하기 때문에 읽 기 쓰기 서브 프로 세 스 의 출력 흐름 이나 입력 흐름 이 신속하게 실패 하면
하위 프로 세 스 가 막 히 거나 잠 금 이 생 길 수 있 습 니 다.
    abstract  void destroy()   
                   。   
    abstract  int exitValue()   
                       。    , 0      。   
    abstract  InputStream getErrorStream()   
                       。   
    abstract  InputStream getInputStream()   
                       。   
    abstract  OutputStream getOutputStream()   
                       。   
    abstract  int waitFor()   
                      ,    ,        Process            。  
                  ,       。          ,         ,       。  

특히 주의해 야 할 것 은 하위 프로 세 스 의 입력 흐름,출력 흐름 이나 오류 흐름 의 내용 이 많 으 면 캐 시 를 사용 하 는 것 이 좋 습 니 다(위의 상황 2).
Runtime 클래스 다시 보기:
  Java        Runtime   ,                 。    getRuntime           。   
           Runtime   。  

몇 가지 주요 방법 을 소개 합 니 다.
    Process exec(String command)   
                              。  
    Process exec(String command, String[] envp)   
                                  。  
    Process exec(String command, String[] envp, File dir)   
                                        。  
    Process exec(String[] cmdarray)   
                             。   
    Process exec(String[] cmdarray, String[] envp)   
                                 。   
    Process exec(String[] cmdarray, String[] envp, File dir)   
                                       。   

command:지정 한 시스템 명령 입 니 다.
envp:환경 변수 문자열 배열,그 중에서 모든 환경 변수의 설정 형식 은 name=value 입 니 다.하위 프로 세 스 가 현재 프로 세 스 의 환경 을 계승 해 야 한다 면 이 인 자 는 null 입 니 다.
dir:하위 프로 세 스 의 작업 디 렉 터 리;하위 프로 세 스 가 현재 프로 세 스 의 작업 디 렉 터 리 를 계승 해 야 한다 면 이 인 자 는 null 입 니 다.
cmdarray:호출 명령 과 인 자 를 포함 하 는 배열 입 니 다.
다음은 예제 입 니 다.
    public class test {  
        public static void main(String[] args){  
            InputStream in = null;  
            try {  
                Process pro = Runtime.getRuntime().exec(new String[]{"sh",  
                                         "/home/test/test.sh","select admin from M_ADMIN",  
                                         "/home/test/result.txt"});  
                pro.waitFor();  
                in = pro.getInputStream();  
                BufferedReader read = new BufferedReader(new InputStreamReader(in));  
                String result = read.readLine();  
                System.out.println("INFO:"+result);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }  

여기 서 는 Process exec(String[]cmdarray)라 는 방법 을 사용 합 니 다.
 /홈/test/test.sh 스 크 립 트 는 다음 과 같 습 니 다.
    #!/bin/sh  
      
    #  sql  
    SQL=$1  
    #          
    RESULT_FILE=$2  
    #       
    DB_NAME=scott  
    DB_PWD=tiger  
    DB_SERVER=DB_TEST  
      
    RESULT=`sqlplus -S ${DB_NAME}/${DB_PWD}@${DB_SERVER}<< !   
    set heading off  
    set echo off  
    set pages 0  
    set feed off  
    set linesize 3000  
    ${SQL}  
    /  
    commit  
    /  
    !`  
          
    echo "${RESULT}" >> ${RESULT_FILE}  
    echo 0;  

특히 주의해 야 할 것 은 실행 해 야 할 Liux 명령 에 파이프 문자 가 있 을 때(예 를 들 어 ps-ef|grep 자바)위의 방법 으로 는 안 됩 니 다.해결 방법 은 실행 해 야 할 명령 을 매개 변수 로 셸 에 전달 하 는 것 입 니 다.
    public class Test {  
        public static void main(String[] args) throws Exception{  
            String[] cmds = {"/bin/sh","-c","ps -ef|grep java"};  
            Process pro = Runtime.getRuntime().exec(cmds);  
            pro.waitFor();  
            InputStream in = pro.getInputStream();  
            BufferedReader read = new BufferedReader(new InputStreamReader(in));  
            String line = null;  
            while((line = read.readLine())!=null){  
                System.out.println(line);  
            }  
        }  
    }  

PS:
Runtime.getRuntime().exec()와 같은 호출 방식 은 자바 가상 컴퓨터 에서 자원 을 매우 소모 합 니 다.명령 이 빨리 실행 되 더 라 도 빈번 한 호출 시 프로 세 스 를 만 드 는 데 매우 객관 적 입 니 다.
자바 가상 컴퓨터 가 이 명령 을 실행 하 는 과정 은 먼저 현재 가상 컴퓨터 와 같은 환경 변 수 를 가 진 프로 세 스 를 복제 한 다음 에 이 새로운 프로 세 스 로 외부 명령 을 실행 하고 마지막 으로 이 프로 세 스 를 종료 하 는 것 입 니 다.잦 은 생 성 은 CPU 와 메모리 에 대한 소모 가 매우 크다.
 
From:
http://blog.csdn.net/a19881029/article/details/8063758
http://www.avajava.com/tutorials/lessons/how-do-i-run-another-application-from-java.html
http://stackoverflow.com/questions/13991007/execute-external-program-in-java
http://stackoverflow.com/questions/15218892/running-a-java-program-from-another-java-program
http://www.rgagnon.com/javadetails/java-0014.html
http://www.javacoffeebreak.com/faq/faq0030.html
http://www.youtube.com/watch?v=AiVpzFH9zRc

좋은 웹페이지 즐겨찾기