Redhat 계열 (CentOS)에 tomcat 을 init.d의 서비스로 등록해서 부팅시 자동으로 시작되게 하는 방법을 정리해 본다.

java 와 tomcat 은 제대로 설치되고 설정되어 있다고 가정한다.

init.d 폴더에 등록

run-level utility 인 chkconfig 에 등록하려면 먼저 booting/shutdown 시 참조하는 폴더인 /etc/init.d 에 스크립트가 등록되어 있어야 한다.

  1. 구동 스크립트(최종 버전은 gist 에서 찾을 수 있다.)를 /etc/init.d/tomcat-webapp1 으로 저장한다. 하나의 서버에서 여러 개의 tomcat 을 띄울 수 있으므로 식별을 위해 서비스명을 구동 스크립트에 적어주는게 좋고 여기에서는 서비스명이 webapp1 이다.

     Click here to expand...

    /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
  2. tomcat 은 /opt/apache-tomcat-7.0.54 로 설정되어 있으므로 다른 경로에 설치했을 경우 CATALINA_HOME 부분을 수정한다.
  3. 보안 문제때문에 tomcat 프로세스는 tomcat 이라는 계정명으로 구동된다.  다른 계정일 경우TOMCAT_USER 부분을 수정한다.
  4. 실행 속성을 부여한다.

    chmod +x /etc/init.d/tomcat-webapp1
    CODE

run-level 에 등록

부팅과 동시에 실행하려면 run-level 에 등록하면 된다.

  1. 다음 명령어로 run level 에 등록한다.

    chkconfig --add tomcat-webapp1 
    CODE
  2. 제대로 등록되었는지 확인한다. (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
  3. 이제 부팅 및 shutdown 시에 자동으로 실행/종료될 것 이다.

cmd 에서 실행

  1. 다른 service 명령과 동일한 옵션을 제공하므로 shell 상에서도 사용할 수 있다.
  2. 시작

    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
CODE

일반 사용자로 구동은 위와 마찬가지로 service 명령을 통해 수행하면 되고 이 경우 실행 정보는 tomcat 설치 경로에 .${PROCESS_NAME}.pid 형식으로 남게 스크립트가 작성되어 있다.