nginx google Windows 云计算 centos mysql 开源 Firefox 微软 编程 php shell apache Android 程序员 wordpress linux Python Ubuntu java

運維經驗分享(七)– Linux Shell之ChatterServer服務控制腳本第三次優化

剛接到開發人員要求,今晚上線新的ChatterServer版本,新版本目錄存在一些變化,要求我出一個新的服務控制腳本,因此在前兩版的基礎上有了第三版,前兩版地址《運維經驗分享(一)-- Linux Shell之ChatterServer服務控制腳本》和《運維經驗分享(二)-- Linux Shell之ChatterServer服務控制腳本二次優化》

增加softlink invoke和今天改良的shell腳本中的一些好的方法和技巧,今天改良的shell腳本請參考文章《運維經驗分享(五)-- 改進的JAVA進程管理的服務控制腳本》。

有幾個已知的問題:

basename因為時間原因使用了絕對路徑,後期將更新新版

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

:

延伸阅读

评论