Tomcat start/stop script

You could just link to catalina.sh and get the basic stop/start functionality working but it has some drawbacks:

  • Sometimes tomcat doesn’t stop gracefully and you have to reach for ps, grep and kill
  • You have to sometimes pass in some configuration options to Tomcat to enable JMX, increase the max memory it can use, etc.
  • The catalina.sh script doesn’t include the commands to make chkconfig and update-rc.d work.
  • It doesn’t let you run Tomcat as a different user.
  • The restart argument does not work

I started with the script from Yoryos here and modified it to suit my needs a little better: http://blog.valotas.com/2011/05/tomcat-initd-script.html

This script allows you to keep the configuration separate so you don’t have to edit catalina.sh directly. It also handles killing Tomcat in case it doesn’t gracefully shut down.

This script should be put in /etc/init.d/tomcat

On Debian-based systems run this to register the script:
update-rc.d tomcat defaults

On RedHat-based OSes use this to register the script:
chkconfig --add tomcat

#!/bin/bash
#
# tomcat This shell script takes care of starting and stopping Tomcat
# It also handles killing Tomcat in case it doesn't stop gracefully
# It uses a PID file to determine the process ID so it should work with multiple Tomcat instances on one server
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Tomcat service
# Short-Description: start and stop tomcat
### END INIT INFO

## Source function library.
#. /etc/rc.d/init.d/functions

# Begin configuration section

export JAVA_HOME=/opt/jdk1.6.0

# These options are used when Tomcat is started
export CATALINA_OPTS="-Xmx512m -XX:-UseGCOverheadLimit \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=511 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false"

export LD_LIBRARY_PATH=/usr/local/apr/lib

# Set this to the path where this Tomcat is installed
TOMCAT_HOME=/opt/tomcat

# Number of seconds to wait after nicely requesting stop
SHUTDOWN_WAIT=10

# This should be a different file for each tomcat
CATALINA_PID=/var/run/tomcat.pid

RUNASUSER=root

# End configuration section

export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_PID

start() {
pid=`cat $CATALINA_PID 2>/dev/null`
if [ -n "$pid" ]
then
echo "Tomcat is already running (pid: $pid)"
else
# Start tomcat
echo "Starting tomcat"
touch $CATALINA_PID
chown $RUNASUSER $CATALINA_PID
/bin/su -p -s /bin/sh $RUNASUSER $TOMCAT_HOME/bin/catalina.sh start
fi

return 0
}

stop() {
pid=`cat $CATALINA_PID 2>/dev/null`
if [ -n "$pid" ]
then
/bin/su -p -s /bin/sh $RUNASUSER $TOMCAT_HOME/bin/catalina.sh stop
echo -n "Stopping Tomcat"

let kwait=$SHUTDOWN_WAIT
count=0;
until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
do
echo -n ".";
sleep 1
let count=$count+1;
done

echo ""

if [ $count -gt $kwait ]; then
echo "process is still running after $SHUTDOWN_WAIT seconds, killing process"
kill $pid
sleep 3

# if it's still running use kill -9
if [ `ps -p $pid | grep -c $pid` -gt '0' ]; then
echo "process is still running, using kill -9"
kill -9 $pid
sleep 3
fi

fi

if [ `ps -p $pid | grep -c $pid` -gt '0' ]; then
echo "process is still running, I give up"
else
# success, delete PID file
rm $CATALINA_PID
fi
else
echo "Tomcat is not running"
fi
return 0
}

case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
pid=$(tomcat_pid)
if [ -n "$pid" ]
then
echo "Tomcat is running with pid: $pid"
else
echo "Tomcat is not running"
fi
;;
esac
exit 0

Leave a Reply