자바 호출 셸 명령 과 스 크 립 트 구현
때때로 우 리 는 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 로 설정 되 어 있 으 면 호출 명령 이 현재 프로그램 이 실행 중인 디 렉 터 리 에서 실 행 될 것 임 을 표시 합 니 다.따라서 다른 디 렉 터 리 에 있 는 파일 과 스 크 립 트 는 절대 경 로 를 사용 하 는 것 이 좋 습 니 다.매개 변수의 의미:
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.셸 스 크 립 트 호출자바 가 셸 명령 을 호출 하 는 것 은 셸 스 크 립 트 를 호출 하 는 것 과 똑 같 습 니 다.나 는 여기에 다른 몇 가지 방면 을 소개 한다.
호출 출력 정 보 를 캡 처 합 니 다.앞에서 도 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
자바 호출 셸 명령 과 스 크 립 트 의 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 호출 셸 명령 과 스 크 립 트 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.