RHEL/CentOS 에 tomcat 을 service 로 등록하여 booting 시 자동으로 구동되게 하기
Redhat 계열 (CentOS)에 tomcat 을 init.d의 서비스로 등록해서 부팅시 자동으로 시작되게 하는 방법을 정리해 본다.
java 와 tomcat 은 제대로 설치되고 설정되어 있다고 가정한다.
init.d 폴더에 등록
run-level utility 인 chkconfig 에 등록하려면 먼저 booting/shutdown 시 참조하는 폴더인 /etc/init.d 에 스크립트가 등록되어 있어야 한다.
구동 스크립트(최종 버전은 gist 에서 찾을 수 있다.)를 /etc/init.d/tomcat-webapp1 으로 저장한다. 하나의 서버에서 여러 개의 tomcat 을 띄울 수 있으므로 식별을 위해 서비스명을 구동 스크립트에 적어주는게 좋고 여기에서는 서비스명이 webapp1 이다.
/etc/init.d/tomcat-webapp1
#!/bin/bash # # tomcat # # chkconfig: 345 96 30 # description: Start up the Tomcat servlet engine. # # processname: java # pidfile: /var/run/tomcat.pid # ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $network $syslog # Required-Stop: $network $syslog # Should-Start: distcache # Short-Description: start and stop Apache HTTP Server # Description: implementation for Servlet 2.5 and JSP 2.1 ## END INIT INFO # Source function library. . /etc/init.d/functions ## tomcat installation directory PROCESS_NAME=tomcat-servicename CATALINA_HOME="/home/lesstif/apache-tomcat-7.0.54/" ## run as a diffent user TOMCAT_USER=lesstif ## Path to the pid, runnning info file pidfile=${PIDFILE-/var/run/${PROCESS_NAME}.pid}; lockfile=${LOCKFILE-/var/lock/subsys/${PROCESS_NAME}}; RETVAL=0 case "$1" in start) PID=`pidofproc -p ${pidfile} ${PROCESS_NAME}` if [[ (-n ${PID}) && ($PID -gt 0) ]]; then logger -s "${PROCESS_NAME}(pid ${PID}) is already running." exit; fi if [ -f $CATALINA_HOME/bin/startup.sh ]; then logger -s "Starting Tomcat" /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/startup.sh -Dprocessname=${PROCESS_NAME}" PID=`ps -eaf|grep processname=${PROCESS_NAME}|grep -v grep|awk '{print $2}'` RETVAL=$? [ $RETVAL = 0 ] && touch ${lockfile} [ $RETVAL = 0 ] && echo "${PID}" > ${pidfile} fi ;; stop) PID=`pidofproc -p ${pidfile} ${PROCESS_NAME}` ## if PID valid run shutdown.sh if [[ -z ${PID} ]];then logger -s "${PROCESS_NAME} is not running." exit; fi if [[ (${PID} -gt 0) && (-f $CATALINA_HOME/bin/shutdown.sh) ]]; then logger -s "Stopping Tomcat" /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/shutdown.sh" RETVAL=$? [ $RETVAL = 0 ] && rm -f ${lockfile} [ $RETVAL = 0 ] && rm -f ${pidfile} fi ;; status) status -p ${pidfile} ${PROCESS_NAME} RETVAL=$? ;; restart) $0 stop $0 start ;; version) if [ -f $CATALINA_HOME/bin/version.sh ]; then logger -s "Display Tomcat Version" /bin/su -l ${TOMCAT_USER} -c "$CATALINA_HOME/bin/version.sh" RETVAL=$? fi ;; *) echo $"Usage: $0 {start|stop|restart|status|version}" exit 1 ;; esac exit $RETVAL
BASH- tomcat 은 /opt/apache-tomcat-7.0.54 로 설정되어 있으므로 다른 경로에 설치했을 경우 CATALINA_HOME 부분을 수정한다.
- 보안 문제때문에 tomcat 프로세스는 tomcat 이라는 계정명으로 구동된다. 다른 계정일 경우TOMCAT_USER 부분을 수정한다.
실행 속성을 부여한다.
chmod +x /etc/init.d/tomcat-webapp1
CODE
run-level 에 등록
부팅과 동시에 실행하려면 run-level 에 등록하면 된다.
다음 명령어로 run level 에 등록한다.
chkconfig --add tomcat-webapp1
CODE제대로 등록되었는지 확인한다. (run level이 3,4,5 일때 구동된다)
$ chkconfig --list tomcat-webapp1 tomcat 0:off 1:off 2:off 3:on 4:on 5:on 6:off
CODE- 이제 부팅 및 shutdown 시에 자동으로 실행/종료될 것 이다.
cmd 에서 실행
- 다른 service 명령과 동일한 옵션을 제공하므로 shell 상에서도 사용할 수 있다.
시작
service tomcat-webapp1 start
CODE재시작
$ service tomcat-webapp1 restart lesstif: Stopping Tomcat Using CATALINA_BASE: /opt/apache-tomcat-7.0.54 Using CATALINA_HOME: /opt/apache-tomcat-7.0.54 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.54/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.54/bin/bootstrap.jar:/opt/apache-tomcat-7.0.54/bin/tomcat-juli.jar lesstif: Starting Tomcat Using CATALINA_BASE: /opt/apache-tomcat-7.0.54 Using CATALINA_HOME: /opt/apache-tomcat-7.0.54 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.54/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.54/bin/bootstrap.jar:/opt/apache-tomcat-7.0.54/bin/tomcat-juli.jar Tomcat started.
CODE종료
service tomcat-webapp1 stop
CODE상태 보기
$ service tomcat-webapp1 status tomcat (pid 12162)를 실행하고 있습니다..
CODE
run-level 에서 삭제
tomcat 은 1024 이상의 포트에서 구동되므로 root 로 실행할 필요가 없고 해당 서비스 계정으로 실행하는게 보안상 더 안전하다. tomcat 구동을 service 명령을 통해서 일반 사용자가 하고 싶을 경우 다음 명령어로 자동 실행을 끈다
chkconfig tomcat-webapp1 off
일반 사용자로 구동은 위와 마찬가지로 service 명령을 통해 수행하면 되고 이 경우 실행 정보는 tomcat 설치 경로에 .${PROCESS_NAME}.pid 형식으로 남게 스크립트가 작성되어 있다.