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

運維經驗分享(一)– 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--

延伸阅读

评论