运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

简介:

运维经验分享作为一个专题,目前共7篇文章

  1. 运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本

  2. 运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

  3. 运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)

  4. 运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

  5. 运维经验分享(五)-- 改进的java进程管理的服务控制脚本

  6. 运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)

  7. 运维经验分享(七)-- Linux Shell之ChatterServer服务控制脚本第三次优化

====================================分割线======================================

最近开发人员提出新的需求,想将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(可以参考《UNIX/Linux环境编程必须需要注意的问题总结》)

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篇文章

  1. 运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本

  2. 运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

  3. 运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)

  4. 运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析

  5. 运维经验分享(五)-- 改进的java进程管理的服务控制脚本

  6. 运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)

  7. 运维经验分享(七)-- Linux Shell之ChatterServer服务控制脚本第三次优化






本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1674188,如需转载请自行联系原作者

相关文章
|
18小时前
|
前端开发 Shell 应用服务中间件
shell实战脚本1-前端打包脚本
```markdown 这是一个Bash脚本,用于自动化前端应用的更新流程:切换到`performance-appraisal-web`目录,检出`release`分支,拉取最新代码,使用自定义镜像源安装npm包,构建无登录模式,清理Nginx静态目录,复制构建结果,打包dist目录为`dist.zip`,清除旧zip,并将zip文件复制到临时目录。最后,列出临时目录内容并记录日志到`faban.log`。 ```
29 18
|
3天前
|
Shell Linux C语言
|
5天前
|
Shell 网络安全
shell脚本 配饰ssh
【7月更文挑战第15天】
10 4
|
8天前
|
Shell
Shell 脚本编程保姆级教程(下)
Shell 脚本编程保姆级教程(下)
|
9天前
|
JavaScript 前端开发 Shell
Shell 脚本编程保姆级教程(上)
Shell 脚本编程保姆级教程(上)
|
9天前
|
Java Shell Linux
【Linux】手把手教你做一个简易shell(命令行解释器)
【Linux】手把手教你做一个简易shell(命令行解释器)
10 0
|
9天前
|
网络协议 Shell Linux
Shell脚本配置Centos静态ip地址
这是一个用于在CentOS上设置静态IP的Shell脚本摘要: - 脚本交互式获取用户输入的IP地址、子网掩码、网关和DNS。 - 使用`sed`命令动态更新`/etc/sysconfig/network-scripts/ifcfg-ENS33`配置文件。 - 修改`BOOTPROTO`为`static`,并设置IP、NETMASK、GATEWAY和DNS1字段。 - 用`systemctl restart network`重启网络服务。 - 提示用户新配置的静态IP信息。
|
15天前
|
运维 监控 大数据
部署-Linux01,后端开发,运维开发,大数据开发,测试开发,后端软件,大数据系统,运维监控,测试程序,网页服务都要在Linux中进行部署
部署-Linux01,后端开发,运维开发,大数据开发,测试开发,后端软件,大数据系统,运维监控,测试程序,网页服务都要在Linux中进行部署
|
15天前
|
Shell Linux
Linux Shell 脚本入门教程:开启你的自动化之旅
Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。
|
1天前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。