내장 톰캣을 구동시키면서 실행되는 어플리케이션의 경우 포트번호 단위로 프로세스를 죽이고 살리고 하는 것이 어렵지 않았다. 하지만 웹 서비스를 끼지 않고 실행되는 배치가 존재하는 경우 서버안에서 실행되는 어플리케이션의 개수가 지속적으로 늘어나면서 db 커넥션도 여러개 물고 있는 경우도 생기면서 서비스 품질에 영향을 주게 되었다.
리눅스의 ps -ef | grep
명령어를 사용하여 프로세스 id를 검색하고 검색한 프로세스 id를 기준으로 프로세스를 죽이는 방향으로 리서치를 해보았다.
문제가 하나 존재했는데 만약 ps -ef | grep 'java -jar'
로 프로세스를 검색하는 경우 java -jar로 실행되는 어플리케이션이 만약에 또 존재한다면 다른 어플리케이션도 함께 죽게 될것 같았다. 그래서 시도해보니 ps -ef | grep 'java -jar' | grep 'admin-batch' 이런식으로 체이닝이 가능했다!
그리고 이것만으로는 안되고 해당 프로세스 id를 가져와야 하는데, 현재 명령어에서 awk '{print $2}'를 붙여주면 프로세스 id를 불러올 수 있었다.
ps -ef | grep 'java -jar' | grep 'admin-batch' | awk '{print $2}'
검색해봤더니 프로세스 id가 407389로 나온다.
전체 명령어를 작성해보자.
kill -9 `ps -ef | grep 'java -jar' | grep 'admin-batch' | awk '{print $2}'`
awk명령어로 불러온 id값을 담기 위해 ``로 감싸주었다. 해석하면 'java -jar', 'admin-batch'를 포함하는 프로세스를 검색하고 awk 명령어로 id값 ($2)을 불러오고 해당 id값 정보를 참고하여 kill -9 명령어를 실행한다.
명령어를 실행하고 나서 확인해보니 정상적으로 어플리케이션 프로세스가 종료된 것을 확인할 수 있었다.
ubuntu에서 실행한 결과이다.