아직 처리중인 클라이언트가 남아 있거나 등의 여러 가지 이유로 톰캣을 구동한 Java VM 이 깨끗하게 종료되지 않는 경우가 있다. 보통 이런 경우는 Server Port 를 사용하는 쓰레드(thread)는 종료되었지만 Connector 쓰레드는 종료되지 않아 shutdown.sh 로 종료할 수 없다.
이럴 때는 직접 pid 를 얻어서 kill 명령어로 시그널을 전송해서 종료시켜야 한다. 이때 KILL(9) 시그널을 전송 하는데 KILL 시그널은 프로세스가 종료 루틴을 제대로 호출하지 못 할수 있으므로 좋은 방법은 아니다.
종료용 signal 인 TERM 시그널을 여러 번 보낸 후에 그래도 종료되지 않으면 최후의 수단으로 KILL 시그널을 전송하는 게 좋다.
pid를 얻고 실행 여부를 확인하고 시그널을 보내는 등의 일련의 작업을 간단한 쉘 스크립트로 구현했으니 shutdown.sh 대신 사용해도 된다.(gist 링크)
Click here to expand...
젠킨스나 기타 지속적인 통합 솔루션에서 톰캣의 핫 디플로이 기능을 이용하여 어플리케이션을 배포할 경우 PermGen 에러가 발생하면 디플로이도 안 되고 톰캣이 제대로 종료되지 않는 경우가 발생한다.
이럴 경우 핫 디플로이대신 SSH 로 변경하고 종료 스크립트로 위 스크립트를 사용하는 방법이 있다.