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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1677214

运维经验分享作为一个专题,目前共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版本,新版本目录存在一些变化,要求我出一个新的服务控制脚本,因此在前两版的基础上有了第三版,前两版地址《运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本》和《运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

增加softlink invoke和今天改良的shell脚本中的一些好的方法和技巧,今天改良的shell脚本请参考文章《运维经验分享(五)-- 改进的java进程管理的服务控制脚本》。

有几个已知的问题:

  1. BASENAME因为时间原因使用了绝对路径,后期将更新新版
  2. log日志的某些处理上有些多余,将于后期更新新版

其他问题欢迎各位网友、博友批评指正和留言!

现将脚本内容粘贴如下:


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

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

#!/bin/bash

#chkconfig: 345 86 14

#description: Startup and shutdown script for ChatterServer(Port:$SERVICEPORT)

 

# Public header

# resolve links - $0 may be a softlink

PRG="$0"

while [ -h "$PRG" ]; do

  ls=`ls -ld "$PRG"`

  link=`expr "$ls" '.*-> \(.*\)$'`

  if expr "$link" '/.*' /dev/nullthen

    PRG="$link"

  else

    PRG=`dirname "$PRG"`/"$link"

  fi

done

# Get standard environment variables

PRGDIR=`dirname "$PRG"`

# Public header

WORKDIR=$PRGDIR

# end public header

# -Public header

 

#BASEDIR=..

BASEDIR=/data/chatter

VERSION=1.0.0-snapshot

SERVER=$BASEDIR/chatter-$VERSION\.jar

LOGDIR=$BASEDIR/logs

if [[ ! -d $LOGDIR ]]; then

    mkdir $LOGDIR

fi

PORTFILE=$BASEDIR/conf/constant.properties

# TODO

# reslove dos2unix packages

SERVICEPORT=$(cat $PORTFILE | dos2unix | grep ^port | awk -F '=' '{print $2}')

PIDFILE=$LOGDIR/chatter.pid

BASENAME=chatter

ARGS="-Xms4g -Xmx8g -Xmn8g -Xss256k -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() {

    if [[ ! -f $PIDFILE ]]; then

        echo "ERROR: ChatterServer(Port:$SERVICEPORT) pid file is NOT exist"

        exit 1

    fi

    if [[ ! -d /proc/$(cat $PIDFILE) ]]; then

            echo "ERROR:  ChatterServer(Port:$SERVICEPORT) is NOT running"

            exit 1

    else

            echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) pid($(cat $PIDFILE)) is OK"

    fi

    # 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) ]];then

        echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) is OK"

    else

        echo "ERROR: ChatterServer(Port:$SERVICEPORT) port is NOT listen"

        exit 1

    fi

}

 

start() {

    if [[ -e $PIDFILE ]]; then

        if [[ -d /proc/$(cat $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

    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/../

        cd $BASEDIR

        ## TODO 

        ## Because current directory has changed 

    #SERVER=./chatter-$VERSION\.jar

        #LOGDIR=./logs

        #nohup java -jar $SERVER $ARGS >>$LOGDIR/console-$(date +"%Y%m%d").out 2>&1 &

        if java -jar $SERVER $ARGS >>$LOGDIR/console.out 2>&1 &

        then

            sleep 2

            if [[ -d /proc/$! ]]; then

                echo $! > $PIDFILE

                echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) start OK"

                echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) started with pid $(cat $PIDFILE) " >>$LOGDIR/service.log

            fi

        elif java -jar $SERVER $ARGS >>$LOGDIR/console.out 2>&1 &

        then

            sleep 2

            if [[ -d /proc/$! ]]; then

                echo $! > $PIDFILE

                echo "SUCCESS: ChatterServer(Port:$SERVICEPORT) start OK"

                echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) started with pid $(cat $PIDFILE) " >>$LOGDIR/service.log

            fi

        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

            if test -d /proc/$(cat $PIDFILE)

            then

                sleep 60

            else

                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 

                # Remove pid file

                /bin/rm $PIDFILE

            fi

        elif kill -KILL $pid >/dev/null 2>&1 && sleep 1

            then

                if test -d /proc/$(cat $PIDFILE)

                then

                sleep 60

                else

                    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

                    # Remove pid file

                    /bin/rm $PIDFILE

                fi

        elif kill -9 `cat $PIDFILE` >>$LOGDIR/console.out 2>&1

        then

            while [[ -d /proc/$(cat $PIDFILE) ]]; do

                leep 1

            done

            if test -d /proc/$(cat $PIDFILE)

            then

                echo "server stop failed"

                exit 1

            else

                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

                # Remove pid file

                /bin/rm $PIDFILE

            fi

        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

    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

:

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

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

  1. 运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本
  2. 运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化
  3. 运维经验分享(三)-- 解决Ubuntu下crontab不能正确执行Shell脚本的问题(一)
  4. 运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析
  5. 运维经验分享(五)-- 改进的java进程管理的服务控制脚本
  6. 运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)
  7. 运维经验分享(七)-- Linux Shell之ChatterServer服务控制脚本第三次优化

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1677214

时间: 2025-01-31 01:18:45

运维经验分享(七)-- Linux Shell之ChatterServer服务控制脚本第三次优化的相关文章

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1674188 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1677211 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1677155 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1676490 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1677157 运维经验分享作为一个专题,目前共7篇文章 <运维经验分享(一)-- Linux Shell之ChatterServer服务控制脚本> <运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化> <运维经验分享(三)-- 解决Ubuntu下cro

运维经验分享:Hadoop管理员的十个最佳实践

大多数管理员都是从Apache Hadoop开始学习.笔者最开始也使用Apache版本Hadoop进行开发和部署工作,但接触到Cloudera CDH后,我发现它可以使管理员的工作更简单,不仅可以获得最新的特性和Bug修复,有时也会带来令人惊喜的性能改善. 接触Hadoop有两年的时间了,期间遇到很多的问题,既有经典的NameNode和JobTracker内存溢出故障,也有HDFS存储小文件问题,既有任务调度问题,也有MapReduce性能问题.遇到的这些问题有些是Hadoop自身的缺陷(短板)

优云运维经验分享之 – 剖析CMDB的设计过程

作为IT管理的核心,CMDB逐渐成为系统管理项目实施的热点.在很多的案例中,由于忽视了CMDB的因素,ITIL的深入应用受到了极大的挑战.同时,由于CMDB是IT管理信息的集中,CMDB也是一个重要的工具和手段. 在CMDB落地过程中需要注意的是,CMDB项目不是一个简单的软件安装过程,而是一个咨询.培训.实施.优化密切结合的综合过程,涉及到平台工具采购.咨询服务.实施服务.培训.甚至扩展开发等内容.同时,一个成功的CMDB项目不能一蹴而就,而是一个循序渐进.持续发展的过程,需要企业后续的投入和

运维经验分享:关于系统运维监控的几点建议

目前很多企业信息化系统都有自己的监控平台和监控手段,无论是采用哪种手段去实现对系统的实时监控和故障告警,大多采用的方式也只有两种:集中式监控和分布式监控.本文作者根据自身公司监控存在的问题,总结了一些经验并提出一些在监控平台的建议,以供大家参考学习,如有考虑不周的地方还希望大家多多批评指正. 为了更好.更有效的保障系统上线后的稳定的运行.对于服务器的硬件资源.性能.带宽.端口.进程.服务等都必须有一个可靠和可持续的监测机制,统计分析每天的各种数据,从而能及时反映出服务器哪里存在性能瓶颈.安全隐患

《IT运维之道》一3.3 掌握服务平衡

3.3 掌握服务平衡 IT运维的第一件要事是按照IT运维服务的原则做事,第二件要事就是将这些原则应用到IT运维服务工作当中.IT运维服务工作从服务的发起方来看可以分为主动服务和受理服务. 我们曾将IT运维专家比作IT系统的保健医生,保健医生最重要的能力是"治未病"的能力.在我国关于"治未病"最著名的故事是扁鹊见蔡桓公的故事.有一天,扁鹊进见蔡桓公,在蔡桓公面前站一会儿,说道:"您的皮肤纹理间有点小病,不医治恐怕要加重."蔡桓公说:"我没