tomcat bin目录下已经有了启动、关闭的脚本,写这个脚本主要是为了方便自动化运维,把tomcat和jdk推到服务器上解压后,把这个脚本传到PATH目录下,改个名字,给个执行权限就可以了,可以少设置很多东西,同时功能更加丰富。主要有以下几点功能:
都在脚本里,详细的自己看脚本吧。可以实现tomcat start/stop/status/kill/tail/clean/dump等功能。
#!/bin/bash # Author: Will # WebSite: https://www.nixops.me # description: Tomcat multi-function script #tomcat install dir export CATALINA_HOME=/opt/tomcat-9.0_blog/ #TOMCAT_USER is the default user of tomcat export TOMCAT_USER=tomcat #SHUTDOWN_WAIT is wait time in seconds for java proccess to stop SHUTDOWN_WAIT=5 # add java JDK path export JAVA_HOME=/opt/jdk1.8 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #####以上是按需修改的地方###### #TOMCAT_USAGE is the message if this script is called without any options TOMCAT_USAGE="用法: $0 {/e[00;32mstart/e[00m|/e[00;31mstop/e[00m|/e[00;31mkill/e[00m|/e[00;32mstatus/e[00m|/e[00;31mrestart/e[00m|/e[00;32mtail/e[00m|/e[00;32mclean|/e[00;31mdump/e[00m}/n/ 参数模式: $0 {/e[00;32m[action] /e[00;31m[tomcat path] /e[00;31m[run user] /e[00m} /n/n 启动参数说明: /n start: 启动tomcat /n stop: 正常停止tomcat /n kill: 杀掉tomcat进程 /n status: 查看状态,是否运行/详细的运行状态 /n restart: 调用stop/start重启tomcat /n tail: 使用tail命令查看catalina.out日志 /n clean: tomcat关闭时,清理缓存目录temp/webapp/work /n dump: 使用jinfo/jmap/jstack导出jvm信息 /n/n 参数模式主要供脚本调用,或者多个tomcat公用一个init脚本;CATALINA_HOME和TOMCAT_USER通过参数传入,脚本中无需指定,使用方法: /n $0 启动参数 tomcat路径 运行用户 /n $0 status /opt/tomcat8/ tomcat /n " #Check init script ARGS if [ "$#" -eq "3" ] ;then echo -e "/e[00;32mInit Script Run With Args /e[00m" export CATALINA_HOME=$2 export TOMCAT_USER=$3 elif [ "$#" -ne "1" ] ;then echo -e $TOMCAT_USAGE exit 1 fi #tomcat work dir export CATALINA_BASE=$CATALINA_HOME #Set init Run Env PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:$CATALINA_HOME/bin export PATH tomcat_pid() { echo `ps -fe | grep $CATALINA_BASE |grep java | grep -v grep | tr -s " "|cut -d" " -f2` } tomcat_start_set() { if [ `user_exists $TOMCAT_USER` -eq "0" ]; then echo -e "/e[00;31mSystem User: $TOMCAT_USER not exist /e[00m" exit 1 elif [ `whoami` != "$TOMCAT_USER" ] && [ `whoami` != "root" ]; then echo -e "/e[00;31mMust Run as : root or $TOMCAT_USER /e[00m" exit 1 fi chown -R $TOMCAT_USER $CATALINA_HOME $CATALINA_BASE echo -e "/e[00;32mSet CATALINA_HOME CATALINA_BASE Permission Done/e[00m" if [ ! -z "$CATALINA_BASE" ]; then /rm -rf $CATALINA_BASE/temp/* $CATALINA_BASE/work/* $CATALINA_BASE/webapps/* echo -e "/e[00;32mClean Tomcat work/temp/webapps Done/e[00m" fi ulimit -n 100000 umask 007 } start() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;31mTomcat is already running (pid: $pid)/e[00m" else echo -e "/e[00;32mStarting Tomcat : $CATALINA_HOME/e[00m" tomcat_start_set if [ `whoami` = "root" ] then /bin/su $TOMCAT_USER -c "cd $CATALINA_HOME/bin ; /bin/bash startup.sh" else cd $CATALINA_HOME/bin ; /bin/bash startup.sh fi status fi return 0 } status(){ pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;32mTomcat is running with pid: /e[00;31m$pid/e[00m" ppid=`ps --no-headers -p $pid -o ppid` cpu=`ps --no-headers -p $pid -o %cpu` mem=`ps --no-headers -p $pid -o %mem` user=`ps --no-headers -p $pid -o user` group=`ps --no-headers -p $pid -o group` stime=`ps --no-headers -p $pid -o stime` etime=`ps --no-headers -p $pid -o etime` rss=`ps --no-headers -p $pid -o rss` vsz=`ps --no-headers -p $pid -o size` cmd=`ps --no-headers -p $pid -o cmd` echo -e "/e[00;32mPPID: /e[00;31m$ppid /e[00m" echo -e "/e[00;32mRun User: /e[00;31m$user /e[00m" echo -e "/e[00;32mRun Group: /e[00;31m$group /e[00m" echo -e "/e[00;32mCurrent Tomcat CPU Usage: /e[00;31m$cpu% /e[00m" echo -e "/e[00;32mCurrent Tomcat Mem Usage: /e[00;31m$mem% /e[00m" echo -e "/e[00;32mRSS Mem: /e[00;31m$rss KB /e[00m" echo -e "/e[00;32mVSZ Mem: /e[00;31m$vsz KB /e[00m" echo -e "/e[00;32mStart Time: /e[00;31m$stime /e[00m" echo -e "/e[00;32mTotal Run Time: /e[00;31m$etime /e[00m" echo -e "/e[00;32mStart Cmd: /e[00;31m$cmd /e[00m" else echo -e "/e[00;31mTomcat is not running/e[00m" fi } terminate() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;31mPid: $pid,Terminating Tomcat/e[00m" kill -9 $(tomcat_pid) else echo -e "/e[00;31mTomcat Pid Not Found,Skip Kill !/e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;31mStoping Tomcat/e[00m" sh $CATALINA_HOME/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "/n/e[00;31mwaiting for processes to exit/e[00m"; sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "/n/e[00;31mkilling processes didn't stop after $SHUTDOWN_WAIT seconds/e[00m" terminate fi else echo -e "/e[00;31mTomcat is not running/e[00m" fi return 0 } user_exists(){ if id -u $1 >/dev/null 2>&1; then echo "1" else echo "0" fi } tail_log(){ pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;31mPid: $pid,run tail -f $CATALINA_BASE/logs/catalina.out/e[00m" tail -n 100 -f $CATALINA_BASE/logs/catalina.out else echo -e "/e[00;31mTomcat Pid Not Found,Skip Tail Log !/e[00m" fi } clean(){ pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;31m Tomcat Running With Pid: $pid,Skip Clean/e[00m" else echo -e "/e[00;32mClean Tomcat logs and work/temp/webapps /e[00m" if [ ! -z "$CATALINA_BASE" ]; then /rm -rf $CATALINA_BASE/logs/* echo -e "/e[00;32mClean Tomcat logs/* Done/e[00m" /rm -rf $CATALINA_BASE/temp/* $CATALINA_BASE/work/* $CATALINA_BASE/webapps/* echo -e "/e[00;32mClean Tomcat work/temp/webapps Done/e[00m" fi fi } dump(){ pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "/e[00;31m Tomcat Running With Pid: $pid,Start dumping /e[00m" JAVA_HOME=`ps --no-headers -p $pid -o cmd |awk -F bin '{print $1}'` if [ -n "$JAVA_HOME" ];then echo -e "/e[00;31m jinfo Dump pid : $pid to /tmp/tomcat_"$pid"_jinfo_`date -I`.log /e[00m" $JAVA_HOME/bin/jinfo $pid > /tmp/tomcat_"$pid"_jinfo_`date -I`.log echo -e "/e[00;31m jstack Dump pid : $pid to /tmp/tomcat_"$pid"_jstack_`date -I`.log /e[00m" $JAVA_HOME/bin/jstack -F $pid > /tmp/tomcat_"$pid"_jstack_`date -I`.log echo -e "/e[00;31m jmap -heap Dump pid : $pid to /tmp/tomcat_"$pid"_jmap_heap_`date -I`.log /e[00m" $JAVA_HOME/bin/jmap -heap -F $pid > /tmp/tomcat_"$pid"_jmap_heap_`date -I`.log echo -e "/e[00;31m jstat -gcutil Dump pid : $pid to /tmp/tomcat_"$pid"_jstat_gcutil_`date -I`.log /e[00m" $JAVA_HOME/bin/jstat -gcutil $pid > /tmp/tomcat_"$pid"_jstat_gcutil_`date -I`.log echo -e "/e[00;31m jmap -histo Dump pid : $pid to /tmp/tomcat_"$pid"_jmap_histo_`date -I`.log ,this action will trigger GC First/e[00m" $JAVA_HOME/bin/jmap -histo -F $pid > /tmp/tomcat_"$pid"_jmap_histo_`date -I`.log echo -e "/e[00;31m jmap -clstats Dump pid : $pid to /tmp/tomcat_"$pid"_jmap_clstats_`date -I`.log , this action will suspend the app /e[00m" $JAVA_HOME/bin/jmap -clstats -F $pid > /tmp/tomcat_"$pid"_jmap_clstats_`date -I`.log echo -e "/e[00;31m jmap -dump Dump pid : $pid to /tmp/tomcat_"$pid"_jmap_dump_`date -I`.log , this action will suspend the app /e[00m" $JAVA_HOME/bin/jmap -dump:live,format=b,file=/tmp/tomcat_"$pid"_jmap_clstats_`date -I`.log $pid else echo -e "/e[00;31m Can't found jinfo/jstack/jmap/jstat under $JAVA_HOME/bin/ , Skip Dump /e[00m" fi else echo -e "/e[00;32mTomcat not Running. Skip Dump! /e[00m" fi } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; kill) terminate ;; tail) tail_log ;; clean) clean ;; dump) dump ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0