자바 프로그램 에서 리 눅 스 명령 실행(JSP 에서 다른 프로그램 실행)
9659 단어 링크 ux 명령
우선 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux 운영 기초 기능: 스 크 립 트 프로 그래 밍 과 Linux 명령$와 $@ 의 차이 $와 $@ 은 함수 나 스 크 립 트 에 전 달 된 모든 인 자 를 표시 합 니 다. 작은 따옴표 (") 에 포함 되 지 않 을 때"$1 ","$2 ","$n "형식 으로 모든 인 자 를 출력 합...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.