本文共 8492 字,大约阅读时间需要 28 分钟。
运维经验分享作为一个专题,目前共7篇文章
《》
《》
《》
《》
《》
《》
《》
====================================分割线======================================
最近开发人员提出新的需求,想将ChatterServer服务控制脚本放到ChatterServer根目录下的bin目录下,并向一次性可以部署多个实例,因此这一个需求引发了多个改变:
1.不再使用service进行控制,仍然保留status、start、stop和restart功能
2.BASEDIR不再使用绝对路径而要使用相对路径,例如BASEDIR=..
3.SERVICEPORT要从ChatterServer根目录下的conf目录中的文件中读取
4.日志目录logs将不再手动创建,控制脚本需要自己创建logs目录
针对以上4点变更,改进如下
1.去掉service控制,只需要将此脚本放到ChatterServer根目录下的bin目录下执行(实际上更简单了)
2.既然要使用相对路径而不使用绝对路径就要正确设置Shell脚本的当前工作目录,否则非但脚本不好用(log和pid都无法正常生成),还会导致ChatterServer的核心命令行无法使用(无法读取到相对路径下的配置文件)
3.要想SERVICEPORT从ChatterServer根目录下的conf目录中的文件中读取,非常简单,但疑难问题在于排查上,例如grep对dos文件格式(file format)的文件非常不友好,会对脚本中后面的命令产生巨大影响(特别是echo以及变量(以$开头的字符串)几乎会乱掉),因此在使用grep前,必须将此文件的内容通过dos2unix命令来转化,除非开发人员乐意将文件格式从dos手动改为unix(可以参考《》)
4.相当于多了一层异常检测而已,比较简单,看新的ChatterServer服务控制脚本就会明白。
经过二次“优化”改造的脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | #!/bin/bash #chkconfig: 345 86 14 #description: Startup and shutdown script for ChatterServer(Port:$SERVICEPORT)) VERSION=1.0.0-snapshot BASEDIR=.. # choose LOGDIR as standard of work directory LOGDIR=$( pwd )/$BASEDIR /logs if [[ ! -d $LOGDIR ]]; then mkdir $LOGDIR fi #SERVICEPORT=29093 #SERVICEPORT=`grep ^port $(pwd)/../conf/constant.properties | awk -F '=' '{print $2}'` # NOTE: $(pwd)/../conf/constant.properties file fileformat must be unix NOT dos in shell scripts, or will cause some unknown error # NOTE: grep is vrey sensitive to dos fileformat or unix fileformat # apt-get install dos2unix PORTFILE=$( pwd )/.. /conf/constant .properties SERVICEPORT=$( cat $PORTFILE | dos2unix | grep ^port | awk -F '=' '{print $2}' ) PIDFILE=$LOGDIR /chatter .pid SERVER=$( pwd )/$BASEDIR /chatter- $VERSION\.jar BASENAME=chatter ARGS= "-Xms2g -Xmx4g -Xmn4g -Xss128k -XX:MaxPermSize=64m -XX:-UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=30 -XX:SurvivorRatio=6" # -Xms2g -Xmx2g -Xmn2g -Xss128k -XX:MaxPermSize=64m -XX:-UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=30 -XX:SurvivorRatio=6 status() { # The judgment priority: pid > port > piffile # netstat run by common user will get some error output, so we put those error outout to /dev/null if [[ $( netstat -anop 2> /dev/null | grep $SERVICEPORT | grep LISTEN) || -f $PIDFILE ]]; then #pid=$(cat $PIDFILE) pid=$( ps -ef | grep java | grep $BASENAME | grep - v grep | awk '{print $2}' ) if [[ $pid != "" && $( ps -ef | grep $pid | grep - v grep ) ]]; then echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) is OK" exit 0 else echo "ERROR: ChatterServer(Port:$SERVICEPORT) pid is NOT exist" exit 1 fi elif [[ ! $( netstat -anop 2> /dev/null | grep $SERVICEPORT | grep LISTEN) ]]; then echo "ERROR: ChatterServer(Port:$SERVICEPORT) port is NOT listen" exit 1 elif [[ ! -f $PIDFILE ]]; then echo "ERROR: ChatterServer(Port:$SERVICEPORT) pid file is NOT exist" exit 1 else echo "ERROR: ChatterServer(Port:$SERVICEPORT) is NOT running" exit 1 fi } start() { if [[ -e $PIDFILE ]]; then echo "ERROR: pidfile $PIDFILE exist, ChatterServer(Port:$SERVICEPORT) has started with pid $(cat $PIDFILE)" # pid file can be deleted /bin/rm -f $PIDFILE exit 1 fi if [[ -e $SERVER ]]; then echo "INFO: Starting ChatterServer(Port:$SERVICEPORT)" # Start ChatterServer core daemon # Why using "date +"%Y%m%d""? Because we just need restart this once per day # For ChatterServer wiil find some file in $BASEDIR cd $LOGDIR/../ #nohup java -jar $SERVER $ARGS >>$LOGDIR/console-$(date +"%Y%m%d").out 2>&1 & java -jar $SERVER $ARGS >>$LOGDIR /console- $( date + "%Y%m%d" ).out 2>&1 & #java -jar $SERVER $ARGS >$LOGDIR/console.out 2>&1 & RETVAL=$? # shell do NOT need home directory ## For ChatterServer wiil find some file in $BASEDIR cd $LOGDIR/.. /bin if [[ $RETVAL - eq 0 ]]; then ## $! --> Expands to the process ID of the most recently executed background (asynchronous) command. #echo $! > $PIDFILE # For java performance issue, port 29092 will listen latter, we will waiting for 2 second sleep 2 # get pid var # TODO remove debug info #echo "DEBUG: " #ps -ef | grep $BASENAME | grep -v grep | awk '{print $2}' # end debug #pid=$(ps -ef | grep java | grep $BASENAME | grep -v grep | awk '{print $2}') pid=$( netstat -anop 2> /dev/null | grep $SERVICEPORT | grep LISTEN | awk '{print $7}' | awk -F '/' '{print $1}' ) # send pid number to pid file echo $pid > $PIDFILE # Those lines will remove in next release # TODO remove debug info #echo "DEBUG: live 1" # For java performance issue, port 29092 will listen latter, so we change judgment conditions if [[ $( netstat -anop 2> /dev/null | grep $SERVICEPORT | grep LISTEN) || -f $PIDFILE ]]; then echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) start OK" # Setting up start log echo "[ $(date +" %D %T ") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) started with pid $(cat $PIDFILE) " >>$LOGDIR /service .log fi # TODO remove debug info #echo "DEBUG: live 2" # -Those lines will remove in next release #echo "SUCCESS: ChatterServer start OK" ## Setting up start log #echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer started with pid $(cat $PIDFILE) " >>$LOGDIR/service.log else echo "ERROR: ChatterServer(Port:$SERVICEPORT) start failed" # Setting up start log echo "[ $(date +" %D %T ") ] ERROR: ChatterServer(Port:$SERVICEPORT) start failed " >>$LOGDIR /service .log exit $RETVAL fi else echo "ERROR: Couldn't find $SERVER" # TODO We just think this is not essential # Do NOT setting up log here exit 1 fi } stop() { if [[ -e $PIDFILE ]]; then pid=$( cat $PIDFILE) #if kill -TERM $PIDFILE >/dev/null 2>&1 # TODO remove debug info #echo "DEBUG: $LOGDIR/console-$(date +"%Y%m%d").out" # Ubuntu can NOT use "usleep", so use "sleep" instead # usleep 100000 if kill -TERM $pid >>$LOGDIR /console- $( date + "%Y%m%d" ).out && sleep 1 then echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) stop OK with TERM" # Setting up stop log echo "[ $(date +" %D %T ") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) stop OK with TERM " >>$LOGDIR /service .log # Because we can NOT use usleep , so we must comment out sleep 1 next #sleep 1 # Ubuntu can NOT use "usleep", so use "sleep" instead # usleep 100000 elif kill -KILL $pid > /dev/null 2>&1 && sleep 1 then echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) stop OK with KILL" # Setting up stop log echo "[ $(date +" %D %T ") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) stop OK with KILL " >>$LOGDIR /service .log # Because we can NOT use usleep , so we must comment out sleep 1 next #sleep 1 else echo "ERROR: ChatterServer(Port:$SERVICEPORT) stop faild" # Setting up stop log echo "[ $(date +" %D %T ") ] ERROR: ChatterServer(Port:$SERVICEPORT) stop failed " >>$LOGDIR /service .log exit 1 fi # Remove pid file if [[ -f $PIDFILE ]]; then /bin/rm -f $PIDFILE fi else echo "ERROR: No ChatterServer(Port:$SERVICEPORT) running" # TODO We just think this is not essential # Do NOT setting up log here exit 1 fi } restart() { echo "INFO: Restarting ChatterServer(Port:$SERVICEPORT)" stop # Those lines will remove in next release if [[ $( netstat -anop 2> /dev/null | grep $SERVICEPORT | grep LISTEN) ]]; then echo "WARNNING: port $SERVICEPORT is in using, must waiting" sleep 5 if [[ $( netstat -anop 2> /dev/null | grep $SERVICEPORT | grep LISTEN) ]]; then echo "WARNNING : port $SERVICEPORT is still in using, must waiting" sleep 2 fi fi # -Those lines will remove in next release # Do NOT using sleep any seconds here with stop() function used start } case $1 in status) status ;; start) start ;; stop) stop ;; restart) restart ;; help|*) echo "Usage: $0 {status|start|stop|restart|help} with $0 itself" exit 1 ;; esac # replace "exit 0" with ":" #exit 0 : |
--end--
====================================分割线======================================
运维经验分享作为一个专题,目前共7篇文章
《》
《》
《》
《》
《》
《》
《》