티스토리 뷰

안녕하세요~

오랜만에 글을 씁니다.

거두절미, 사설 잡설 빼고 내용만 쓰겠습니다.


젠킨스(jenkins) 또는 허드슨(hudson)에서는 빌드 시 빌드가 종료되는 시점에

빌드 진행 중 발생한 자식 프로세스(child process)를 종료(kill) 시켜버립니다.

하지만 빌드 시 특정 쉘 스크립트, 또는 windows batch command는 종료하지 않고 계속 실행해야 하는

그런 뭔가 느낌적인 느낌이 드는 업무가 발생할 때가 있습니다.


참고로 제가 예를 드는 경우는

특정 톰캣 프로세스가 몇번의 작업을 마치고 나면 gc 동작 이후에도 memory leak의 발생이 빈번하여서

종종 해당 톰캣 서버를 종료한 후 다시 기동하기 위하여 젠킨스를 통하여 편하게 처리하기 위해서 

다음과 같은 방법을 사용하였습니다.


참고로 아래 설정 예제는 젠킨스(jenkins) 및 윈도우 서버에 톰캣 기준으로 작성하였습니다.


우선, 해당 내용에 대한 자세한 설명은

위 링크를 참고하시기 바라고요.


우선, 톰캣이던지 다른 웹서버이던지 해당 JVM 파라미터에 아래 파라미터 값을 설정해줍니다.

-Dhudson.util.ProcessTree.disable=true



그리도 젠킨스 기동 후 해당 빌드(또는 실행) 프로젝트의 '구성' 페이지로 들어갑니다.

그리고 해당 프로젝트에 다음과 같이 빌드 매개변수(build parameter)을 추가합니다.



매개변수 명 : BUILD_ID

Default Value : dontKillMe

반드시 대/소문자 확실히 구분하여 입력하여 주시구요.


그리고 나서 빌드 스텝을 추가하여(Add build step) 실행하고자 하는 명령어를 실행하면 됩니다.

윈도우에서 실행한다면 "Execute Windows batch command"를,

유닉스/리눅스에서 실행한다면 "Execute shell" 을 이용하여 명령어를 실행하여 프로세스를 구동하시면 됩니다.

참고로 저는 이전에 말씀드렸다시피 톰캣 서버를 셧다운 시킨 후 다시 재시작 시키는 작업이 필요했습니다.

그래서 다음 이미지와 같이 설정하였습니다.



참고로 해당 명령어도 제대로 보실 수 있도록 넣어드립니다. 친절하게요...

d:

cd "D:\test\bin\tomcat7"

set "CATALINA_HOME=D:\test\bin\tomcat7"

set "CATALINA_BASE=D:\test\bin\tomcat7"

cmd /c bin\shutdown.bat

cmd /c bin\startup.bat


대략 설명하자면, d 드라이브로 변경 후 톰캣 디렉토리로 이동하여 톰캣 환경변수 설정 후 톰캣을 셧다운한다.

그리고 다시 톰캣 시작하는 스크립트를 구동시키는 것입니다.

톰캣 shutdown.bat 명령어의 실행은 별도 독립된 커맨드창으로 실행하지 않습니다.

하지만 startup.bat으로 톰캣을 구동하면 catalina의 실행은 독립된 새 창에서 실행을 하게 됩니다.

이때 processtreekiller을 사용하지 않으면, 모든 빌드 프로세스가 완료 후 종료 시 해당 빌드의 자식 프로세스를

모두 종료시켜버리는데, 이 때 톰캣 프로세스 또한 종속된 자식 프로세스로서 동시에 종료가 되어 버립니다.


이를 방지하고 빌드 프로세스가 종료되더라도 톰캣은 정상적으로 실행되도록 하기 위해서

위와 같이 설정하는 것입니다.

참고로 저의 시간과 작업 환경에 의해서 리눅스나 유닉스에서 쉘 스크립트에서는 해보지 않았습니다만,

빌드 매개변수로 넣지 않고 커맨드에 직접 입력하여도 된다고

여러 외국인 개발자분들이 삽질 결과를 올려주셨더라구요. 뭐 유닉스/리눅스 쉘 스크립트에만 된다지만...

쉘스크립트에 

BUILD_ID=dontKillMe ./script_to_run_here.sh

이런식으로 실행하고자 하는 명령어를 이용하여 처리하면 된다고는 합니다. 제가 해본건 아닙니다. 절대.


그럼 업무시간이니까 다들 열심히 하시구요~ 저녁 맛있게 드시고

비오는 중복 몸보신 잘 하셔서 여름 잘 나시기 바라겠습니다 ^^

















댓글
  • 프로필사진 ㄴㅇ 헤메고 있었는데 덕분에 쉽게 해결했네요. 감사합니다. 2016.04.11 23:07 신고
  • 프로필사진 깨드기쫑 저야말로..
    하찮은 제 게시물이 도움이 되셨다니...
    더욱 더 감사합니다 ^^
    2016.04.18 08:54 신고
  • 프로필사진 초보개발자 덕분에 동작이 잘되고 있습니다. 감사합니다.
    궁금한게 있는데요, -Dhudson.util.ProcessTree.disable=true
    이 옵션이 자식프로세스를 죽이는 기능을 끄는 걸로 알고 있습니다.
    그래서 저는 이 부분만 설정해도 잘 동작하고 있는데요. 왜 빌드매개변수에 dontKillMe를 추가적으로 설정하는지 이해가 잘 안되는데 혹시 알려주실 수 있나요?

    제가 생각하는바는 Dhudson.util.ProcessTree.disable=true이 옵션을 안넣을 경우 dontKillMe 설정을 해준다입니다. 의견주시면 감사하겠습니다 ㅎㅎ
    2019.01.08 11:32 신고
댓글쓰기 폼