运维经验分享(一)-- 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的服务控制脚本,即能通过service命令来控制ChatterServer的启动、停止、重新启动以及状态查看,就像mysql有/etc/init.d/mysql或/etc/init.d/mysqld一样,只是这个ChatterServer的服务控制脚本写起来更加困难,有些信息的捕获和判断更加复杂,原因还是主要与ChatterServer的运行方式和启动过程中发生的一些事情有关,这个在脚本的注释中已经充分的标注清楚了。

由于ChatterServer运行在Ubuntu上,因此跟CentOS还是有很大的差异,例如sleep 1和usleep 100000上,CentOS能控制更精确的延时,而Ubuntu不能支持usleep因此不能控制更精确的延时,导致潜在的性能问题。

为方便阅读,在此简单举几个问题例子:

1.ChatterServer的java核心命令行执行后,可能是由于程序或者性能原因,会延迟建立端口连接;

2.ChatterServer的jar包里面用到了一些配置文件,在特定的目录下,必须先进入这些目录才能执行java核心命令行;

问题解决办法:

针对第一个问题,采用多重判断和延时执行的方法;

针对第二个问题,调试时带来问题较多,后来才与开发沟通,弄明白其原因;

此脚本还根据开发的需求,将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
#!/bin/bash
#chkconfig: 345 86 14
#description: Startup and shutdown script for ChatterServer
VERSION=1.0.0-snapshot
BASEDIR= /data/chatterserver
LOGDIR=$BASEDIR /logs
SERVICEPORT=29092
PIDFILE=$BASEDIR /pid/chatter .pid
SERVER=$BASEDIR /chatter- $VERSION\.jar
BASENAME=chatter
# -Xms2g -Xmx2g -Xmn2g -Xss128k -XX:MaxPermSize=64m -XX:-UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=30 -XX:SurvivorRatio=6
ARGS= ""
 
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 is OK"
             exit  0
         else
             echo  "ERROR: ChatterServer pid is NOT exist"
             exit  1
         fi
     elif  [[ ! $( netstat  -anop 2> /dev/null  grep  $SERVICEPORT |  grep  LISTEN) ]];  then
             echo  "ERROR: ChatterServer port is NOT listen"
             exit  1
     elif  [[ ! -f $PIDFILE ]];  then
         echo  "ERROR: ChatterServer pid file is NOT exist"
         exit  1
     else
         echo  "ERROR:  ChatterServer is NOT running"
         exit  1
     fi
}
 
start() {
     if  [[ -e $PIDFILE ]];  then
         echo  "ERROR: pidfile $PIDFILE exist, server 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"
         # 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  $BASEDIR
     #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 
         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}' )
             # 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 start OK"
                 # Setting up start log 
                 echo  "[ $(date +" %D %T ") ] SUCCESS: ChatterServer 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 start failed"
             # Setting up start log 
             echo  "[ $(date +" %D %T ") ] ERROR: ChatterServer 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 stop OK with TERM"
             # Setting up stop log 
             echo  "[ $(date +" %D %T ") ] SUCCESS: ChatterServer 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 stop OK with KILL"
             # Setting up stop log 
             echo  "[ $(date +" %D %T ") ] SUCCESS: ChatterServer 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 stop faild"
             # Setting up stop log 
             echo  "[ $(date +" %D %T ") ] ERROR: ChatterServer 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 running"
         # TODO We just think this is not essential
         # Do NOT setting up log here
         exit  1
     fi
}
 
restart() {
     echo  "INFO: Restarting ChatterServer"
     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"
         echo  "Usage: service chatter {status|start|stop|restart|help} with service"
         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/1673822,如需转载请自行联系原作者

相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
116 1
|
22天前
|
运维 Kubernetes Devops
自动化运维:从脚本到工具的演进之旅
在数字化浪潮中,自动化运维成为提升效率、保障系统稳定的关键。本文将探索自动化运维的发展脉络,从基础的Shell脚本编写到复杂的自动化工具应用,揭示这一技术变革如何重塑IT运维领域。我们将通过实际案例,展示自动化运维在简化工作流程、提高响应速度和降低人为错误中的重要作用。无论你是初学者还是资深专家,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
27天前
|
运维 Devops
自动化运维:从脚本到DevOps的进化之旅
在数字化时代,自动化运维不仅是提高生产效率的关键,更是企业竞争力的象征。本文将带领读者穿越自动化运维的发展历程,从最初的脚本编写到现代DevOps文化的形成,揭示这一演变如何重塑IT行业的工作模式。通过具体案例,我们将展示自动化工具和实践如何简化复杂任务,优化流程,并促进团队协作。你将发现,自动化运维不仅关乎技术的进步,更体现了人、流程和技术三者之间协同增效的深层逻辑。
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
69 2
6种方法打造出色的Shell脚本
|
1月前
|
机器学习/深度学习 人工智能 运维
自动化运维之路:从脚本到工具的演进
在IT运维领域,效率和准确性是衡量工作成效的关键指标。随着技术的发展,自动化运维逐渐成为提升这两个指标的重要手段。本文将带领读者了解自动化运维的演变历程,从最初的简单脚本编写到现今复杂的自动化工具应用,展示如何通过技术提升运维效率。文章不仅介绍理论和实践案例,还提供了代码示例,帮助读者理解自动化运维的实际应用场景。
|
1月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
129 3
|
1月前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
2月前
|
运维 监控 网络协议
|
1月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
65 1
|
1月前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
90 3