매뉴얼웍스 6.0.24에서는 리눅스용 시작 및 정지 스크립트를 수정할 예정입니다. 매뉴얼웍스가 완전히 종료되기 전에 곧바로 다시 시작하면 웹에 접속할 수 없던 문제를 해결하기 위해서입니다. 이 두 파일은 소프트웨어 업데이트로 교체되지 않으므로 이미 설치하여 사용 중이라면 직접 수정해야 합니다.
윈도우 환경에서는 해당하지 않습니다.
무엇이 문제였나
정지 스크립트는 톰캣에 종료 명령만 보내고 곧바로 실행을 마쳤습니다. 종료 명령을 보낸 것과 프로세스가 실제로 종료되는 것은 다릅니다. 따라서 정지 직후에 시작 스크립트를 실행하면 이전 프로세스가 아직 포트를 사용하고 있어 새 프로세스가 포트를 열지 못합니다.
이때 톰캣은 기동을 중단하지 않고, 포트를 열지 못한 채 나머지 초기화를 마친 후 정상적으로 기동한 것처럼 로그를 남깁니다. 결과적으로 프로세스는 실행 중이지만 웹에는 접속할 수 없는 상태가 됩니다.
이 문제는 소프트웨어 업데이트를 적용할 때 특히 발생하기 쉽습니다. 업데이트는 종료 명령을 받은 후에도 백업과 파일 교체를 계속하기 때문에 종료 명령을 받은 시점부터 프로세스가 실제로 종료될 때까지 1분 이상 걸리기도 합니다.
무엇을 바꾸나
두 파일에 각각 두 줄을 추가하고, 정지 스크립트의 마지막 한 줄을 수정합니다.
shutdown.sh 스크립트는 매뉴얼웍스를 정지한 후 변경해야 합니다. 매뉴얼웍스가 실행 중일 때 먼저 변경하면 기존 프로세스를 정지할 수 없습니다.
시작 스크립트와 정지 스크립트에 PID 파일 지정하기
bin/startup.sh와 bin/shutdown.sh 파일을 엽니다. 두 파일에는 모두 다음 두 줄이 있습니다.
CATALINA_OUT="$RABBITZ_HOME"/logs/catalina.out
export CATALINA_OUT
이 두 줄 바로 아래에 다음 두 줄을 추가합니다.
CATALINA_PID="$RABBITZ_HOME"/logs/catalina.pid export CATALINA_PID
추가한 결과는 다음과 같습니다.
CATALINA_OUT="$RABBITZ_HOME"/logs/catalina.out export CATALINA_OUT CATALINA_PID="$RABBITZ_HOME"/logs/catalina.pid export CATALINA_PID PRGDIR="$CATALINA_HOME/bin"
정지 스크립트에 대기 시간 주기
bin/shutdown.sh 파일의 마지막 줄을 찾습니다.
exec "$PRGDIR"/"$EXECUTABLE" stop "$@"
stop 뒤에 300을 추가합니다.
exec "$PRGDIR"/"$EXECUTABLE" stop 300 "$@"
왜 이것만으로 해결되나
톰캣의 catalina.sh에는 프로세스 종료를 기다리는 코드와 중복 기동을 막는 코드가 이미 들어 있습니다. 하지만 두 기능은 모두 CATALINA_PID가 지정되어 있을 때만 동작합니다. 기존에는 이 값이 없어서 두 기능이 실행되지 않았습니다.
PID 파일을 지정하면 다음과 같이 달라집니다.
정지할 때 프로세스가 실제로 종료될 때까지 기다립니다.
기동할 때 이미 실행 중이면
Tomcat appears to still be running with PID 1234. Start aborted.를 출력하고 중단합니다. 프로세스가 이미 종료되었다면 남아 있는 PID 파일을 자동으로 정리하고 정상적으로 기동합니다.
항상 300초를 기다리지는 않습니다
300은 최대 대기 시간입니다. 1초 간격으로 프로세스가 실행 중인지 확인하다가 프로세스가 종료되면 즉시 다음 단계로 넘어갑니다. 평소에는 1~2초 안에 종료되고, 업데이트를 적용할 때는 업데이트 작업이 끝날 때까지 기다립니다.
300초를 모두 기다리는 경우는 톰캣이 300초 안에 종료되지 않을 때뿐입니다. 이때는 Tomcat did not stop in time.을 출력하고 원인 파악에 사용할 스레드 덤프를 남긴 뒤 스크립트 실행을 마칩니다. 강제 종료는 하지 않습니다. 업데이트 파일을 교체하는 도중에 강제로 종료하면 설치본이 손상될 수 있기 때문입니다.
파일을 통째로 덮어쓰지 마십시오
새 버전의 스크립트로 파일 전체를 바꿀 수도 있지만 권장하지 않습니다. bin/startup.sh에는 자바 힙 크기와 같은 실행 옵션이 들어 있고, 운영 환경에 맞게 값을 조정하여 사용하는 경우가 많습니다. 파일을 덮어쓰면 해당 설정이 기본값으로 돌아갑니다.
앞에서 설명한 대로 두 줄을 추가하고 한 줄을 수정하는 편이 안전합니다.
systemd로 관리하는 경우
systemd 서비스로 매뉴얼웍스를 관리하고 있다면 TimeoutStopSec 값이 우선 적용됩니다. 시스템 기본값은 일반적으로 90초지만 설정에 따라 다를 수 있습니다. 이 시간이 지나면 systemd가 프로세스를 강제로 종료하므로 업데이트를 적용할 때는 이 값도 함께 확인해야 합니다.
확인하기
수정한 정지 스크립트를 실행하면 마지막에 다음 메시지가 나타납니다.
Tomcat stopped.
이 메시지를 확인한 후 시작 스크립트를 실행하면 포트 충돌 없이 기동합니다. 매뉴얼웍스가 실행 중일 때 시작 스크립트를 다시 실행하여 중복 기동이 차단되는지도 확인합니다.