본문 바로가기
Work/Java

[Java] Server 내 특정 PID의 하위 프로세스 모두 Kill 시키기

특정 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 정리해줄 수 있다.