博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化
阅读量:6258 次
发布时间:2019-06-22

本文共 8483 字,大约阅读时间需要 28 分钟。

原创作品,允许转载,转载时请务必以超链接形式标明文章   、作者信息和本声明。否则将追究法律责任。

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

  1. 《》

  2. 《》

  3. 《》

  4. 《》

  5. 《》

  6. 《》

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

  1. 《》

  2. 《》

  3. 《》

  4. 《》

  5. 《》

  6. 《》

  7. 《》

本文出自 “” 博客,请务必保留此出处

你可能感兴趣的文章
iscroll5实现下拉加载更多
查看>>
hdu1753()模拟大型实景数字相加
查看>>
Cocos2d-x之MenuItem
查看>>
Esper学习之六:EPL语法(二)
查看>>
流和文件
查看>>
iOS:UIMapView地图视图控件的简单使用
查看>>
关于Python的3张图
查看>>
作IFRAME于iOS您的设备上支持滚动
查看>>
后台数据库优化——板机
查看>>
C++ redirect input
查看>>
linux_sound_alsa_Android+alsa音频系统中的几个问题
查看>>
IOS Core Image之二
查看>>
python---__getattr__\__setattr_重载'.'操作
查看>>
VMware克隆虚拟机后网络不能正常使用的解决方法
查看>>
android平台TextView使用ImageSpan画廊GIF图像
查看>>
Android开发之ListView-SimpleAdapter的使用
查看>>
App.config提示错误“配置系统未能初始化”
查看>>
Angular - - ngChange、ngChecked、ngClick、ngDblclick
查看>>
JAVA学习第五十九课 — 网络编程概述
查看>>
远程共享文件夹
查看>>