특정 PID의 하위 프로세스를 확인하여 List를 가져오자.
yum install psmisc
Centos서버에 psmisc를 설치하면 pstree를 사용할 수 있다. (서버 프로세스의 하위 목록을 트리로 보여줌)
특정 PID의 하위 Process ID 받아오기
ps -o pid --ppid=찾을PID
ps -o 는 사용자 지정값만 반환하는 명령어로 뒤에 pid를 명시하여 해당값만 반환 받을수 있다.
그 뒤에 검색조건은 "--"을 붙여 조회할 수 있다.
위와 같은 명령어를 통해 자식 PID를 조회할 수 있는데, Depth를 알수 없으니,
재귀적으로 함수를 구현 호출하여 PPID에 해당하는 하나의 Process의 PID를 아래와 같이 뽑았다.
String PID = get("PID"); //PID 받아오기
List<String> PID_GET_CMD = new ArrayList<String>();
// PID_GET_CMD = "/bin/bash -c ps -o pid --ppid=@PID@"
PID_GET_CMD.add("/bin/bash");
PID_GET_CMD.add("-c");
PID_GET_CMD.add("ps -o pid --ppid="+PID);
StringBuilder sb = new StringBuilder(1024);
String s = null;
ProcessBuilder prsbld = null;
Process prs = null;
try {
// 자식 프로세스 조회
prsbld = new ProcessBuilder(PID_GET_CMD);
prs = prsbld.start();
// 결과 받기
BufferedReader stdInput = new BufferedReader(new InputStreamReader(prs.getInputStream()));
// PID 헤드 행 날리기
stdInput.readLine();
// 재귀 호출
while((s = stdInput.readLine()) != null){
set("PID",s.trim());
getPidList();
};
// 자식프로세스 리스트가 없거나, 다 돌았으면, 현재 프로세스 종료
// KILL_CMD = "/bin/bash -c kill -9 @PID@"
// 객체 정리
prs.getErrorStream().close();
prs.getInputStream().close();
prs.getOutputStream().close();
prs.waitFor();
}catch (Exception e) {
set("EXIT_CODE", "-2");
set("ERROR_MESSAGE", e.getMessage());
}
finally {
if(prs != null)
try {
prs.destroy();
}catch(Exception e1) {
}
}
위에 PID값을 인자로 전달해가면서, 재귀호출 로직을 구현해주어 하위 PID LIST를 받아왔다.
getPidList() 메소드
Process Killprs = null;
try{
List<String> KILL_CMD = new ArrayList<String>();
KILL_CMD.add("/bin/bash");
KILL_CMD.add("-c");
KILL_CMD.add("kill "+get("PLIST"));
ProcessBuilder prsbld2 = new ProcessBuilder(KILL_CMD);
Killprs = prsbld2.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(Killprs.getInputStream()));
String s="";
while((s = stdInput.readLine()) != null){
__wlog.debug_println(s);
}
Killprs.getErrorStream().close();
Killprs.getInputStream().close();
Killprs.getOutputStream().close();
Killprs.waitFor();
}catch (Exception e) {
}
finally {
if(Killprs != null)
try {
Killprs.destroy();
}catch(Exception e1) {
}
이렇게 받아온 Pid List를 넘겨주어 Kill시켜주면 좀비프로세스 없이 Kill 정리해줄 수 있다.
'Work > Java' 카테고리의 다른 글
[Java] 예외처리 - Exception, Throws, Throw (0) | 2021.06.24 |
---|---|
[Java] 내부클래스 정리 - 클래스 내, Static, 메소드 내, 익명클래스 (0) | 2021.06.24 |
[Java] ProcessBuilder을 이용해 서버 명령 수행 (0) | 2021.06.07 |
[Java] 호출 클래스, 호출 메소드 출력 (0) | 2020.08.13 |
[Java] public > protected > default > private (0) | 2020.03.22 |