#!/bin/bash
# Script name: Tomcat Startup/shutdown
# Author: fire
# Date: 2016.5.5
# 
# Comment: 
# 根据脚本名启动相应的tomcat进程.系统内一个或多个tomcat时使用,不可添加到 ntsysv 中启动
# 例如,要启动 /home/tomcat_im 则将此脚本复制到 /etc/rc.d/init.d/ 并命名为 tomcat_im
# 因其根据 basename $0 做启动服务名的判定,固不可建立自启动/关闭的软连接
# 要随系统启动请在 /etc/rc.d/rc.local 中加入命令 service tomcat_im start
# 手动启动/关闭请用root用户执行: service tomcat_im {start|stop|restart} 既可
# 日志文件存放位置: /var/log/tomcat.log
# 移植性: 只需更改脚本中如下变量,保持如下变量的正确即可在其他linux系统中使用
# $TUSER(启动tomcat的用户) $TOMCAT_HOME(tomcat5绝对路径) 
# $JAVA_HOME 在环境变量中设置
#
# chkconfig: 2345 80 20
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6

. /etc/profile

# Script start... 
TOMCAT=tomcat
TUSER=tomcat
TOMCAT_HOME=/opt/$TOMCAT
CATALINA_PID=$TOMCAT_HOME/logs/catalina.pid

# Function get_pid
get_pid()
{
    pid=$(ps -ef|grep java |grep -w "$TOMCAT_HOME"|grep -v grep|awk '{print $2}')
    echo $pid
}

# Function Process_stat
process_stat()
{
    pid1=$(get_pid)
    pid2=$(cat $CATALINA_PID 2>/dev/null)
    #if [ -n "$pid1" -a $pid1 -ne 0 ];then
    if [ -n "$pid1" ];then
        if [ -n "$pid2" ];then
            if [ "$pid1" = "$pid2" ];then
                #echo "$TOMCAT is running"
                return 0
            else
                #echo "$TOMCAT is running,but pid file is incorrect!"
                return 1
            fi
        else
            #echo "$TOMCAT is running,but pid file is not exists!"
            return 2
        fi

    else
        #echo "$TOMCAT is stopped"
        return 3
    fi
}

# Function Start
start()  
{  
    process_stat
    STAT=$?
    
    if [ $STAT -eq 0 ];then
        echo "$TOMCAT is running"
        return $STAT
    elif [ $STAT -eq 1 ];then
        echo "$TOMCAT is running,but pid file is incorrect!"
        return $STAT
    elif [ $STAT -eq 2 ];then
        echo "$TOMCAT is running,but pid file is incorrect!"
        return $STAT
    elif [ $STAT -eq 3 ];then
        echo  -n "Start $TOMCAT:"  
        #su - $TUSER -c "$TOMCAT_HOME/bin/startup.sh" >/dev/null 2>&1
        su - $TUSER -c "/usr/local/python2.7/bin/python $TOMCAT_HOME/bin/listenCatalina.py >> $TOMCAT_HOME/logs/listenCatalina.log 2>&1 &"
        su - $TUSER -c "$TOMCAT_HOME/bin/catalina.sh start &>/dev/null"
        RETVAL=$?
        pid=$(ps -o pid,args --no-heading -C java|grep -w $TOMCAT_HOME|awk '{print $1}')
        echo $pid > $CATALINA_PID
        if [ $RETVAL -eq 0 ];then
                echo "[OK]"
        fi
    fi
}  

# Function wait_stop
wait_stop()
{
    time=10
    for((i=1;i<=$time;i++))
    do
        pid=$(get_pid)
        if [ -n "$pid" ];then
            sleep 1
        else
            break
        fi
    done
}

# Function stop
stop()  
{  
    process_stat
    STAT=$?
    pid=$(get_pid)

    if [ $STAT -eq 0 ];then
        echo  -n "Stop $TOMCAT:"  
        if ps -ef | grep "python $TOMCAT_HOME/bin/listenCatalina.py" |grep -v grep > /dev/null ; then
            pythonpid=` ps -ef | grep "python $TOMCAT_HOME/bin/listenCatalina.py" | grep -v grep |awk '{print $2}' `
            for ppid in $pythonpid
            do
                kill $ppid
            done
        fi
        #su - $TUSER -c "$TOMCAT_HOME/bin/shutdown.sh" >/dev/null 2>&1
        su - $TUSER -c "$TOMCAT_HOME/bin/catalina.sh stop 10 -force &>/dev/null"
        wait_stop
        #rm -rf $TOMCAT_HOME/work/*
        #rm -rf $TOMCAT_HOME/temp/*
        num=3
        for((i=1;i<=$num;i++))
        do
            process_stat
            if [ $? -eq 3 ];then
                echo  "[OK]"
                break
            elif [ $i -ne $num ];then
                kill $pid
            else
                kill -9 $pid
                process_stat
                [ $? -eq 3 ] && echo  "[OK]"
            fi
        done
    elif [ $STAT -eq 1 ];then
        echo "can not stop $TOMCAT process,the pid file is incorrect!"
        return $STAT
    elif [ $STAT -eq 2 ];then
        echo "can not stop $TOMCAT process,the pid file is incorrect!"
        return $STAT
    elif [ $STAT -eq 3 ];then
        echo "$TOMCAT is stopped"
        return 0
    fi
}  

# Function status
status()
{
    process_stat
    STAT=$?

    if [ $STAT -eq 0 ];then
        echo "$TOMCAT is running"
        return $STAT
    elif [ $STAT -eq 1 ];then
        echo "$TOMCAT is running,but pid file is incorrect!"
        return $STAT
    elif [ $STAT -eq 2 ];then
        echo "$TOMCAT is running,but pid file is incorrect!"
        return $STAT
    elif [ $STAT -eq 3 ];then
        echo "$TOMCAT is stopped"
        return $STAT
    fi

}

#execute
case "$1" in   
    start)  
        start  
    ;;  
    
    stop)  
        stop
    ;;  
    
    restart)  
        stop
        start  
    ;;  
    status)  
        status
    ;;  
    
    *)  
        echo "Use :$0 {start|stop|restart}"  
    ;;  
esac

version2:

#!/bin/bash
#
# Startup script for Jakarta Tomcat
#
# chkconfig: - 80 10
# description: Jakarta Tomcat Java Servlet/JSP Container


TOMCAT_HOME=/usr/local/tomcat
TOMCAT_STOP=$TOMCAT_HOME/bin/shutdown.sh
TOMCAT_START=$TOMCAT_HOME/bin/startup.sh

#Necessary environment variables
export CATALINA_HOME=$TOMCAT_HOME
export JAVA_HOME=/usr/local/jdk
TOMCAT_USER=application


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

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

#Check for tomcat script
if [ ! -f $TOMCAT_HOME/bin/catalina.sh ]
then
  echo $TOMCAT_HOME/bin/catalina.sh
  echo "Tomcat not available..."
  exit
fi

start() {
  echo "Starting Tomcat: "
  # daemon $TOMCAT_START
  /bin/su - $TOMCAT_USER -s /bin/bash -c $TOMCAT_START
  echo
  touch /var/lock/subsys/tomcatd
  chown application:application /var/lock/subsys/tomcatd
# We may need to sleep here so it will be up for apache
#    sleep 5
# Instead should check to see if apache is up by looking for http.pid
for pid in $(pidof java)
do
    echo "disabling oom on pid $pid"
    echo -17 > /proc/$pid/oom_adj
done
}

stop() {
  echo $"Shutting down Tomcat: "
  echo $TOMCAT_STOP
  /bin/su - $TOMCAT_USER -s /bin/bash -c $TOMCAT_STOP
  rm -f /var/lock/subsys/tomcatd.pid
  sleep 5
  #如果不能关闭tomcat时(tomcat有时的bug),调用以下代码#
  pid=`ps aux |grep "java"|grep "tomcat"|grep -v "grep"|awk '{print $2}'`
  if [ "$pid" = "" ] ; then
    echo "tomcat is shutdown now!"
  else
    echo "force kill tomcat'pid $pid now"
    kill -9 $pid
  fi

}

status() {
  ps -ef | grep java | grep "$TOMCAT_HOME" | grep 'catalina.startup.Bootstrap start' | awk '{print $2}' | tr '\n' ' ' >/tmp/tomcat_process_count.txt
  read line < /tmp/tomcat_process_count.txt
  if [ $line -gt 0 ]; then
    echo -n "tomcatd ( pid "
    ps -ef | grep java | grep "$TOMCAT_HOME" | grep 'catalina.startup.Bootstrap start' | awk '{print $2}' | tr '\n' ' '
    echo ") is running..."
  else
    echo "Tomcat is stopped"
  fi
}

case "$1" in
    start)
        start
        ;;
     stop)
        stop
        ;;
     restart)
        stop
        sleep 3
        start
        ;;
     status)
        status
        ;;
     *)
        echo "Usage: tomcatd {start|stop|restart|status}"
     exit 1
esac