#!/bin/bash # # tomcat5 This shell script takes care of starting and stopping Tomcat # # chkconfig: - 80 20 # ### BEGIN INIT INFO # Provides: tomcat5 # Required-Start: $network $syslog # Required-Stop: $network $syslog # Default-Start: # Default-Stop: # Description: Release implementation for Servlet 2.4 and JSP 2.0 # Short-Description: start and stop tomcat ### END INIT INFO # # - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot # - heavily rewritten by Deepak Bhole and Jason Corley # # Source the function library if [ -r "/etc/rc.d/init.d/functions" ]; then . /etc/rc.d/init.d/functions fi NAME="$(basename $0)" unset ISBOOT if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then NAME="${NAME:3}" ISBOOT="1" fi # For SELinux we need to use 'runuser' not 'su' if [ -x "/sbin/runuser" ]; then SU="/sbin/runuser" else SU="su" fi # Get the tomcat config (use this for environment specific settings) TOMCAT_CFG="/etc/tomcat5/tomcat5.conf" if [ -r "$TOMCAT_CFG" ]; then . ${TOMCAT_CFG} fi # Get instance specific config file if [ -r "/etc/sysconfig/${NAME}" ]; then . /etc/sysconfig/${NAME} fi # Define which connector port to use CONNECTOR_PORT="${CONNECTOR_PORT:-8080}" # Path to the tomcat launch script TOMCAT_SCRIPT="/usr/bin/dtomcat5" # Path to the script that will refresh jar symlinks on startup TOMCAT_RELINK_SCRIPT="${CATALINA_HOME}/bin/relink" # Tomcat program name TOMCAT_PROG="$NAME" # Define the tomcat username TOMCAT_USER="${TOMCAT_USER:-tomcat}" # Define the tomcat group TOMCAT_GROUP="${TOMCAT_GROUP:-tomcat}" # Define the tomcat log file TOMCAT_LOG="${TOMCAT_LOG:-/var/log/tomcat5/catalina.out}" test -e $TOMCAT_LOG || touch $TOMCAT_LOG chown $TOMCAT_USER:$TOMCAT_GROUP $TOMCAT_LOG RETVAL="0" # Look for open ports, as the function name might imply function findFreePorts() { local isSet1="false" local isSet2="false" local isSet3="false" local lower="8000" randomPort1="0" randomPort2="0" randomPort3="0" local -a listeners="( $( netstat -ntl | \ awk '/^tcp/ {gsub("(.)*:", "", $4); print $4}' ) )" while [ "$isSet1" = "false" ] || \ [ "$isSet2" = "false" ] || \ [ "$isSet3" = "false" ]; do let port="${lower}+${RANDOM:0:4}" if [ -z `expr " ${listeners[*]} " : ".*\( $port \).*"` ]; then if [ "$isSet1" = "false" ]; then export randomPort1="$port" isSet1="true" elif [ "$isSet2" = "false" ]; then export randomPort2="$port" isSet2="true" elif [ "$isSet3" = "false" ]; then export randomPort3="$port" isSet3="true" fi fi done } function makeHomeDir() { if [ ! -d "$CATALINA_HOME" ]; then gprintf "%s does not exist, creating\n" "$CATALINA_HOME" if [ ! -d "/var/lib/${NAME}" ]; then mkdir -p /var/lib/${NAME} cp -pLR /var/lib/tomcat5/* /var/lib/${NAME} fi mkdir -p $CATALINA_HOME ${CATALINA_HOME}/conf /var/cache/${NAME}/temp \ /var/cache/${NAME}/work /var/log/${NAME} for i in temp work; do ln -fs /var/cache/${NAME}/${i} ${CATALINA_HOME}/${i} done for i in common server shared webapps; do ln -fs /var/lib/${NAME}/${i} ${CATALINA_HOME}/${i} done ln -fs /var/log/${NAME} ${CATALINA_HOME}/logs cp -pLR /etc/tomcat5/* ${CATALINA_HOME}/conf/ cp -pLR /usr/share/tomcat5/bin $CATALINA_HOME cp -pLR /var/cache/tomcat5/work/* ${CATALINA_HOME}/work/ chown ${TOMCAT_USER}:${TOMCAT_USER} /var/log/${NAME} fi } function parseOptions() { options="" options="$options $( awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \ $TOMCAT_CFG )" if [ -r "/etc/sysconfig/${NAME}" ]; then options="$options $( awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \ /etc/sysconfig/${NAME} )" fi TOMCAT_SCRIPT="$options $TOMCAT_SCRIPT" } # See how we were called. function start() { gprintf "Starting %s: " "${TOMCAT_PROG}" if [ -f "/var/lock/subsys/${NAME}" ] ; then if [ -f "/var/run/${NAME}.pid" ]; then read kpid < /var/run/${NAME}.pid if checkpid $kpid 2>&1; then gprintf "%s process already running\n" "$NAME" echo_success else gprintf "lock file found but no process running for\n" gprintf "pid %s, continuing\n" "$kpid" fi fi fi export CATALINA_PID="/var/run/${NAME}.pid" touch $CATALINA_PID chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID if [ "$CATALINA_HOME" != "/usr/share/tomcat5" ]; then # Create a tomcat directory if it doesn't exist makeHomeDir # If CATALINA_HOME doesn't exist modify port number so that # multiple instances don't interfere with each other findFreePorts sed -i -e "s/8005/${randomPort1}/g" -e "s/8080/${CONNECTOR_PORT}/g" \ -e "s/8009/${randomPort2}/g" -e "s/8443/${randomPort3}/g" \ ${CATALINA_HOME}/conf/server.xml fi $TOMCAT_RELINK_SCRIPT $SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT start" >> $TOMCAT_LOG 2>&1 RETVAL="$?" if [ "$RETVAL" -eq 0 ]; then echo_success touch /var/lock/subsys/${NAME} else echo_failure fi echo return $RETVAL } function status() { RETVAL="1" if [ -f "/var/run/${NAME}.pid" ]; then read kpid < /var/run/${NAME}.pid if checkpid $kpid 2>&1; then gprintf "%s is already running (%s)\n" "$0" "${kpid}" RETVAL="0" echo_success else gprintf "lock file found but no process running for pid %s\n" "$kpid" fi else pid="$(pgrep -u tomcat java)" if [ -n "$pid" ]; then gprintf "%s running (%s) but no PID file exists\n" "$0" "${pid}" RETVAL="0" else gprintf "%s is stopped\n" "$0" fi fi return $RETVAL } function stop() { local STOP_VERBOSE="false" gprintf "Stopping %s: " "$TOMCAT_PROG" if [ ! -f /var/run/${NAME}.pid ]; then gprintf "%s process already stopped\n" "$NAME" echo_success fi if [ -f "/var/lock/subsys/${NAME}" ]; then $SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop" >> $TOMCAT_LOG 2>&1 RETVAL="$?" if [ "$RETVAL" -eq "0" ]; then count="0" if [ -f "/var/run/${NAME}.pid" ]; then read kpid < /var/run/${NAME}.pid until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \ [ "$count" -gt "$SHUTDOWN_WAIT" ]; do if [ "$STOP_VERBOSE" = "true" ]; then gprintf "\nwaiting for processes %s to exit" "$kpid" fi sleep 1 let count="${count}+1" done if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then if [ "$STOP_VERBOSE" = "true" ]; then gprintf "\nkilling processes which didn't stop" gprintf "after " gprintf "%s seconds" "$SHUTDOWN_WAIT" fi kill -9 $kpid fi echo_success if [ "$count" -gt "0" ]; then gprintf "\n" fi fi rm -f /var/lock/subsys/$NAME /var/run/$NAME.pid else echo_failure fi fi } # See how we were called. case "$1" in start) parseOptions start ;; stop) parseOptions stop ;; restart) parseOptions stop sleep 2 start ;; condrestart) if [ -f "/var/run/${NAME}.pid" ]; then parseOptions stop start fi ;; status) status ;; version) parseOptions "${JAVA_HOME}/bin/java" \ -classpath "${CATALINA_HOME}/server/lib/catalina.jar" \ org.apache.catalina.util.ServerInfo ;; *) gprintf "Usage: %s {start|stop|restart|condrestart|status|version}\n" "$TOMCAT_PROG" exit 1 esac exit $RETVAL