|
 |
aedfd1 |
#!/bin/bash
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
# tomcat This shell script takes care of starting and stopping Tomcat
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
# chkconfig: - 80 20
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
# Provides: tomcat
|
|
 |
aedfd1 |
# Required-Start: $network $syslog
|
|
 |
aedfd1 |
# Required-Stop: $network $syslog
|
|
 |
aedfd1 |
# Default-Start:
|
|
 |
aedfd1 |
# Default-Stop:
|
|
 |
aedfd1 |
# Description: Release implementation for Servlet 3.0 and JSP 2.2
|
|
 |
aedfd1 |
# Short-Description: start and stop tomcat
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
|
|
 |
aedfd1 |
# - heavily rewritten by Deepak Bhole and Jason Corley
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
#
|
|
 |
aedfd1 |
#. /etc/rc.d/init.d/functions
|
|
 |
aedfd1 |
# Source LSB function library.
|
|
 |
aedfd1 |
if [ -r /lib/lsb/init-functions ]; then
|
|
 |
aedfd1 |
. /lib/lsb/init-functions
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
exit 1
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
DISTRIB_ID=`lsb_release -i -s 2>/dev/null`
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
NAME="$(basename $0)"
|
|
 |
aedfd1 |
unset ISBOOT
|
|
 |
aedfd1 |
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
|
|
 |
aedfd1 |
NAME="${NAME:3}"
|
|
 |
aedfd1 |
ISBOOT="1"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# For SELinux we need to use 'runuser' not 'su'
|
|
 |
aedfd1 |
if [ -x "/sbin/runuser" ]; then
|
|
 |
aedfd1 |
SU="/sbin/runuser -s /bin/sh"
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
SU="/bin/su -s /bin/sh"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# Get the tomcat config (use this for environment specific settings)
|
|
 |
aedfd1 |
TOMCAT_CFG="/etc/tomcat/tomcat.conf"
|
|
 |
aedfd1 |
if [ -r "$TOMCAT_CFG" ]; then
|
|
 |
aedfd1 |
. $TOMCAT_CFG
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# Get instance specific config file
|
|
 |
aedfd1 |
if [ -r "/etc/sysconfig/${NAME}" ]; then
|
|
 |
aedfd1 |
. /etc/sysconfig/${NAME}
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# Define which connector port to use
|
|
 |
aedfd1 |
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
TOMCAT_SCRIPT="/usr/sbin/tomcat"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# Tomcat program name
|
|
 |
aedfd1 |
TOMCAT_PROG="${NAME}"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
TOMCAT_USER="${TOMCAT_USER:-tomcat}"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# Define the tomcat log file
|
|
 |
aedfd1 |
TOMCAT_LOG="${TOMCAT_LOG:-${CATALINA_HOME}/logs/${NAME}-initd.log}"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
RETVAL="0"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# Look for open ports, as the function name might imply
|
|
 |
aedfd1 |
function findFreePorts() {
|
|
 |
aedfd1 |
local isSet1="false"
|
|
 |
aedfd1 |
local isSet2="false"
|
|
 |
aedfd1 |
local isSet3="false"
|
|
 |
aedfd1 |
local lower="8000"
|
|
 |
aedfd1 |
randomPort1="0"
|
|
 |
aedfd1 |
randomPort2="0"
|
|
 |
aedfd1 |
randomPort3="0"
|
|
 |
aedfd1 |
local -a listeners="( $(
|
|
 |
aedfd1 |
netstat -ntl | \
|
|
 |
aedfd1 |
awk '/^tcp/ {gsub("(.)*:", "", $4); print $4}'
|
|
 |
aedfd1 |
) )"
|
|
 |
aedfd1 |
while [ "$isSet1" = "false" ] || \
|
|
 |
aedfd1 |
[ "$isSet2" = "false" ] || \
|
|
 |
aedfd1 |
[ "$isSet3" = "false" ]; do
|
|
 |
aedfd1 |
let port="${lower}+${RANDOM:0:4}"
|
|
 |
aedfd1 |
if [ -z `expr " ${listeners[*]} " : ".*\( $port \).*"` ]; then
|
|
 |
aedfd1 |
if [ "$isSet1" = "false" ]; then
|
|
 |
aedfd1 |
export randomPort1="$port"
|
|
 |
aedfd1 |
isSet1="true"
|
|
 |
aedfd1 |
elif [ "$isSet2" = "false" ]; then
|
|
 |
aedfd1 |
export randomPort2="$port"
|
|
 |
aedfd1 |
isSet2="true"
|
|
 |
aedfd1 |
elif [ "$isSet3" = "false" ]; then
|
|
 |
aedfd1 |
export randomPort3="$port"
|
|
 |
aedfd1 |
isSet3="true"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
done
|
|
 |
aedfd1 |
}
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
function makeHomeDir() {
|
|
 |
aedfd1 |
if [ ! -d "$CATALINA_HOME" ]; then
|
|
 |
aedfd1 |
echo "$CATALINA_HOME does not exist, creating"
|
|
 |
aedfd1 |
if [ ! -d "/usr/share/${NAME}" ]; then
|
|
 |
aedfd1 |
mkdir /usr/share/${NAME}
|
|
 |
aedfd1 |
cp -pLR /usr/share/tomcat/* /usr/share/${NAME}
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
mkdir -p /var/log/${NAME} \
|
|
 |
aedfd1 |
/var/cache/${NAME} \
|
|
 |
aedfd1 |
/var/tmp/${NAME}
|
|
 |
aedfd1 |
ln -fs /var/cache/${NAME} ${CATALINA_HOME}/work
|
|
 |
aedfd1 |
ln -fs /var/tmp/${NAME} ${CATALINA_HOME}/temp
|
|
 |
aedfd1 |
cp -pLR /usr/share/${NAME}/bin $CATALINA_HOME
|
|
 |
aedfd1 |
cp -pLR /usr/share/${NAME}/conf $CATALINA_HOME
|
|
 |
aedfd1 |
ln -fs /usr/share/java/tomcat ${CATALINA_HOME}/lib
|
|
 |
aedfd1 |
ln -fs /usr/share/tomcat/webapps ${CATALINA_HOME}/webapps
|
|
 |
aedfd1 |
chown ${TOMCAT_USER}:${TOMCAT_USER} /var/log/${NAME}
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
}
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
function parseOptions() {
|
|
 |
aedfd1 |
options=""
|
|
 |
aedfd1 |
options="$options $(
|
|
 |
aedfd1 |
awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \
|
|
 |
aedfd1 |
$TOMCAT_CFG
|
|
 |
aedfd1 |
)"
|
|
 |
aedfd1 |
if [ -r "/etc/sysconfig/${NAME}" ]; then
|
|
 |
aedfd1 |
options="$options $(
|
|
 |
aedfd1 |
awk '!/^#/ && !/^$/ { ORS=" ";
|
|
 |
aedfd1 |
print "export ", $0, ";" }' \
|
|
 |
aedfd1 |
/etc/sysconfig/${NAME}
|
|
 |
aedfd1 |
)"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
TOMCAT_SCRIPT="$options ${TOMCAT_SCRIPT}"
|
|
 |
aedfd1 |
}
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# See how we were called.
|
|
 |
aedfd1 |
function start() {
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
echo -n "Starting ${TOMCAT_PROG}: "
|
|
 |
aedfd1 |
if [ "$RETVAL" != "0" ]; then
|
|
 |
aedfd1 |
log_failure_msg
|
|
 |
aedfd1 |
return
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ -f "/var/lock/subsys/${NAME}" ]; then
|
|
 |
aedfd1 |
if [ -s "/var/run/${NAME}.pid" ]; then
|
|
 |
aedfd1 |
read kpid < /var/run/${NAME}.pid
|
|
 |
aedfd1 |
# if checkpid $kpid 2>&1; then
|
|
 |
aedfd1 |
if [ -d "/proc/${kpid}" ]; then
|
|
 |
aedfd1 |
log_success_msg
|
|
 |
aedfd1 |
if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
|
|
 |
aedfd1 |
echo
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
return 0
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
export CATALINA_PID="/var/run/${NAME}.pid"
|
|
 |
aedfd1 |
touch $CATALINA_PID 2>&1 || RETVAL="4"
|
|
 |
aedfd1 |
if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then
|
|
 |
aedfd1 |
chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
[ "$RETVAL" -eq "0" ] && touch $TOMCAT_LOG 2>&1 || RETVAL="4"
|
|
 |
aedfd1 |
if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then
|
|
 |
aedfd1 |
chown ${TOMCAT_USER}:${TOMCAT_USER} $TOMCAT_LOG
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ "$CATALINA_HOME" != "/usr/share/tomcat" -a "$RETVAL" -eq "0" ]; then
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
makeHomeDir
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
findFreePorts
|
|
 |
aedfd1 |
sed -i -e "s/8005/${randomPort1}/g" -e "s/8080/${CONNECTOR_PORT}/g" \
|
|
 |
aedfd1 |
-e "s/8009/${randomPort2}/g" -e "s/8443/${randomPort3}/g" \
|
|
 |
aedfd1 |
${CATALINA_HOME}/conf/server.xml
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
parseOptions
|
|
 |
aedfd1 |
if [ "$RETVAL" -eq "0" -a "$SECURITY_MANAGER" = "true" ]; then
|
|
 |
aedfd1 |
$SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start-security" \
|
|
 |
aedfd1 |
>> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
[ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ "$RETVAL" -eq "0" ]; then
|
|
 |
aedfd1 |
log_success_msg
|
|
 |
aedfd1 |
touch /var/lock/subsys/${NAME}
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
log_failure_msg "Error code ${RETVAL}"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
|
|
 |
aedfd1 |
echo
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
}
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
function stop() {
|
|
 |
aedfd1 |
echo -n "Stopping ${TOMCAT_PROG}: "
|
|
 |
aedfd1 |
if [ -f "/var/lock/subsys/${NAME}" ]; then
|
|
 |
aedfd1 |
parseOptions
|
|
 |
aedfd1 |
if [ "$RETVAL" -eq "0" ]; then
|
|
 |
aedfd1 |
touch /var/lock/subsys/${NAME} 2>&1 || RETVAL="4"
|
|
 |
aedfd1 |
[ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} stop" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ "$RETVAL" -eq "0" ]; then
|
|
 |
aedfd1 |
count="0"
|
|
 |
aedfd1 |
if [ -s "/var/run/${NAME}.pid" ]; then
|
|
 |
aedfd1 |
read kpid < /var/run/${NAME}.pid
|
|
 |
aedfd1 |
until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
|
|
 |
aedfd1 |
[ "$count" -gt "$SHUTDOWN_WAIT" ]; do
|
|
 |
aedfd1 |
if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
|
|
 |
aedfd1 |
echo "waiting for processes $kpid to exit"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
sleep 1
|
|
 |
aedfd1 |
let count="${count}+1"
|
|
 |
aedfd1 |
done
|
|
 |
aedfd1 |
if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
|
|
 |
aedfd1 |
if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
|
|
 |
aedfd1 |
log_warning_msg "killing processes which did not stop after ${SHUTDOWN_WAIT} seconds"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
kill -9 $kpid
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
log_success_msg
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
rm -f /var/lock/subsys/${NAME} /var/run/${NAME}.pid
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
log_failure_msg
|
|
 |
aedfd1 |
RETVAL="4"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
log_success_msg
|
|
 |
aedfd1 |
RETVAL="0"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
|
|
 |
aedfd1 |
echo
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
}
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
function usage()
|
|
 |
aedfd1 |
{
|
|
 |
aedfd1 |
echo "Usage: $0 {start|stop|restart|condrestart|try-restart|reload|force-reload|status|version}"
|
|
 |
aedfd1 |
RETVAL="2"
|
|
 |
aedfd1 |
}
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
# See how we were called.
|
|
 |
aedfd1 |
RETVAL="0"
|
|
 |
aedfd1 |
case "$1" in
|
|
 |
aedfd1 |
start)
|
|
 |
aedfd1 |
start
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
stop)
|
|
 |
aedfd1 |
stop
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
restart)
|
|
 |
aedfd1 |
stop
|
|
 |
aedfd1 |
start
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
condrestart|try-restart)
|
|
 |
aedfd1 |
if [ -s "/var/run/${NAME}.pid" ]; then
|
|
 |
aedfd1 |
stop
|
|
 |
aedfd1 |
start
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
reload)
|
|
 |
aedfd1 |
RETVAL="3"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
force-reload)
|
|
 |
aedfd1 |
if [ -s "/var/run/${NAME}.pid" ]; then
|
|
 |
aedfd1 |
stop
|
|
 |
aedfd1 |
start
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
status)
|
|
 |
aedfd1 |
if [ -s "/var/run/${NAME}.pid" ]; then
|
|
 |
aedfd1 |
read kpid < /var/run/${NAME}.pid
|
|
 |
aedfd1 |
if [ -d "/proc/${kpid}" ]; then
|
|
 |
aedfd1 |
log_success_msg "${NAME} (pid ${kpid}) is running..."
|
|
 |
aedfd1 |
RETVAL="0"
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
log_warning_msg "PID file exists, but process is not running"
|
|
 |
aedfd1 |
RETVAL="1"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G ${TOMCAT_USER} java)"
|
|
 |
aedfd1 |
if [ -z "$pid" ]; then
|
|
 |
aedfd1 |
# status ${NAME}
|
|
 |
aedfd1 |
# RETVAL="$?"
|
|
 |
aedfd1 |
log_success_msg "${NAME} is stopped"
|
|
 |
aedfd1 |
RETVAL="3"
|
|
 |
aedfd1 |
else
|
|
 |
aedfd1 |
log_success_msg "${NAME} (pid $pid) is running..."
|
|
 |
aedfd1 |
RETVAL="0"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
if [ -f /var/lock/subsys/${NAME} ]; then
|
|
 |
aedfd1 |
pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G ${TOMCAT_USER} java)"
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
if [ -z "$pid" ]; then
|
|
 |
aedfd1 |
log_failure_msg "${NAME} lockfile exists but process is not running"
|
|
 |
aedfd1 |
RETVAL="2"
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
fi
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
version)
|
|
 |
aedfd1 |
${TOMCAT_SCRIPT} version
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
*)
|
|
 |
aedfd1 |
usage
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
esac
|
|
 |
aedfd1 |
|
|
 |
aedfd1 |
exit $RETVAL
|