监控日志文件的md5值/更新时间,如果N分钟后无变化则重启应用

[执行语句如下:(可添加计划任务)]

[[ ]

1
 /bin/bash check_modify.sh  /data/log/policy-root-new-5/policy-root-new-5.$(date +%Y-%m-%d).log  10  policy-root-new-5   policy-root-new-5  '/data/www/apps/policy-root-new-5/bin/boxrun'  restart

[**]\

监控md5值:

.true; .auto-links: .false;}
1
/bin/bash check_md5sum.sh  /data/log/policy-root-new-2/policy-root-new-2.$(date +%Y-%m-%d).log    300   policy-root-new-2   policy-root-new-2  '/data/www/apps/policy-root-new-2/bin/boxrun'  restart
1
 check_md5sum.sh 如下
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
#!/bin/bash 
#author: QingFeng
#qq: 530035210
#blog: http://my.oschina.net/pwd/blog 
#自动检测文件的md5值,经过N分钟后,如果没变化就重启服务
#缺省的配置如下
logdir=/data/log/shell         #日志路径
log=$logdir/check.log            #日志文件 
is_font=1                #终端是否打印日志: 1打印 0不打印 
is_log=1                 #是否记录日志: 1记录 0不记录
restart_file=/data/scripts/run.sh  #服务启动和关闭控制脚本
end_string="所有导数已经结束"  #监控文件结束标识
#动态数据时间 
datef(){
date "+%Y-%m-%d %H:%M:%S"
}
#动态打印日志
print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo "[ $(datef) ] $1"
fi
}
#检查目录
check_dir(){
if [[ ! -d $basedir  ]];then
print_log "目录不存在: $basedir"
exit
fi
}
#检查文件
check_file(){
if [[ ! -f $firt_args  ]];then
print_log "文件不存在: $firt_args"
exit
fi
}
#监控文件&restart
monitor_file(){
content=$(grep "$end_string" $firt_args)
if [[  -z $content  ]];then
print_log ""
print_log "没有找到结束标识,开始监控文件"
print_log  "开始检测文件md5值."
md5_value=$(md5sum $firt_args |awk '{print $1}')
print_log  "等待$second秒..."
sleep $second
md5_next_value=$(md5sum $firt_args |awk '{print $1}')
if [[  $md5_next_value != $md5_value   ]];then
print_log   "文件:$firt_args ------$second秒后发生了变化->退出操作"
exit
fi
if [[ ! -f $restart_file  ]];then
print_log  "服务控制脚本不存在:$restart_file "
exit
fi
print_log  "文件:$firt_args ------$second秒后md5值相等."
print_log  "开始重启."
/bin/bash $restart_file   $third   $fourth $five $six
print_log  "重启完成."
else
print_log "找到结束标识,不需要监控文件."
fi
}
#主函数
run(){
#第一个参数的判断
if [[  "$1" != ""  ]];then
firt_args=$1
check_file 
else
echo -e "
 自动检测文件的md5值,经过N秒钟后,如果没变化就重启服务
 用法示例"
echo -e  "
$0:
   /bin/bash $0  要监控的文件 监控的时间(单位:秒)   应用的名称   应用的关键字    '执行启动的命令'     要做的动作  
exp:
   /bin/bash $0  "/data/log/policy-root-new-2/policy-root-new-2.\$\(date "+%Y-%m-%d"\).log"  10  policy-root-new-2   policy-root-new-2  '/data/www/apps/policy-root-new-2/bin/boxrun'  restart/stop/start
"
exit
fi 
#第二个参数的判断
if [[ $2 != ""  ]];then
second=$2
if [[ $second  -eq 0   ]];then
print_log "第二个参数,不能为0"
exit
fi 
else
print_log "第二个参数,不能为空"
exit
fi 
#第三个参数的判断
if [[ $3 != ""  ]];then
third=$3
else
print_log  "第三个参数,不能为空"
exit
fi
#第四个参数的判断
if [[ $4 != ""  ]];then
fourth=$4
else
print_log  "第四个参数,不能为空"
exit
fi
if [[ $5 != ""  ]];then
five=$5
else
print_log  "第五个参数,不能为空"
exit
fi
if [[ $6 != ""  ]];then
six=$6
else
print_log  "第六个参数,不能为空"
exit
fi
monitor_file
}
run $1 $2 $3 $4 $5 $6
1
run.sh 如下
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
#!/bin/bash
# chkconfig: 2345 93 11
# description:$INS_APP Server
. /etc/rc.d/init.d/functions
JAVA_HOME="/usr/local/jdk"
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:$JAVA_HOME/bin
is_font=1                #终端是否打印日志: 1打印 0不打印
is_log=1                 #是否记录日志: 1记录 0不记录
logdir=/data/log/shell         #日志路径
log=$logdir/restart.log            #日志文件
basedir="/data/www/apps"
baselogdir="/data/log/"
export PATH
#动态数据时间
datef(){
date "+%Y-%m-%d %H:%M:%S"
}
#动态打印日志
print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo "[ $(datef) ] $1"
fi
}
#检查文件
check_file(){
if [[ ! -f $firt_args  ]];then
print_log "文件不存在: $firt_args"
exit
fi
}
#查找进程id
check_pid(){
ps aux  |grep "$second"|grep -v grep |grep -v "cronolog"  |grep -v "run.sh"  |awk '{print $2}' | grep -v "$$"
}
start() {
if [[ ! -f /usr/sbin/cronolog  ]];then
yum install cronolog* -qy
fi
if [[ ! -d  $basedir/$first  ]];then
print_log "目录不存在: $basedir/$first"
exit
fi
nohup /bin/bash $third  2>&1 | /usr/sbin/cronolog  $baselogdir/$first/$first.%Y-%m-%d.log &
ret=$?
if [ $ret -eq 0 ]; then
print_log "启动 $first: 成功"
action $"启动 $first: " /bin/true
pid=$(check_pid)
echo $pid  > $pid_file
else
print_log "启动 $first: 失败"
action $"启动 $first: " /bin/false
fi
#        chmod 755 /etc/init.d/$INS_APP
#        chkconfig --add   $INS_APP
#        chkconfig --level 3  $INS_APP  on
}
stop() {
pid_values=$(check_pid)
if [[ -z $pid_values  ]];then
print_log "应用已经是处于停止的状态"
else
for i in $pid_values
do
kill -9 $i
done
if [[ -z $(check_pid)  ]];then
print_log "停止 $first: 成功"
action $"停止应用 $first: " /bin/true
rm -f $pid_file
else
print_log "停止 $first: 失败"
action $"停止应用 $first: " /bin/false
fi
fi
}
restart() {
stop
sleep 2
start
}
#主函数
run(){
#第一个参数的判断
if [[  "$1" != ""  ]];then
first=$1
pid_file=/var/run/$first.pid
prog=$first
else
echo -e "
自定义应用的启动和关闭
用法示例"
echo -e  "
./$0:
./$0     应用的名称   应用的关键字    '执行启动的命令'     要做的动作
exp:
./$0   policy-root-new-2  policy-root-new-2   "/data/www/apps/policy-root-new-2/bin/boxrun"   start/stop/restart
tips:
应用名称:policy-root-new-2 ->应用的位置即为:/data/www/apps/policy-root-new-2
"
exit
fi
#第二个参数的判断
if [[ $2 != ""  ]];then
second=$2
else
print_log "第二个参数,不能为空"
exit
fi
#第三个参数的判断
if [[ $3 != ""  ]];then
third=$3
else
print_log  "第三个参数,不能为空"
exit
fi
#第四个参数的判断
if [[ $4 != ""  ]];then
forth=$4
case "$forth" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
restart
;;
*)
print_log "第三个参数,只能为:start/stop/restart/status"
exit 1
esac
else
print_log  "第四个参数,不能为空"
exit
fi
}
run $1 $2 $3 $4

效果图:

监控文件的更新时间:

1
check_modify.sh
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
#!/bin/bash 
#author: QingFeng
#qq: 530035210
#blog: http://my.oschina.net/pwd/blog 
#自动检测文件的最新更新时间,经过N分钟后,如果没变化就重启服务
#缺省的配置如下
logdir=/data/log/shell         #日志路径
log=$logdir/check.log            #日志文件 
is_font=1                #终端是否打印日志: 1打印 0不打印 
is_log=1                 #是否记录日志: 1记录 0不记录
restart_file=/data/scripts/run.sh  #服务启动和关闭控制脚本
end_string="所有导数已经结束"  #监控文件结束标识
#动态数据时间 
datef(){
date "+%Y-%m-%d %H:%M:%S"
}
#动态打印日志
print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo "[ $(datef) ] $1"
fi
}
#检查目录
check_dir(){
if [[ ! -d $basedir  ]];then
print_log "目录不存在: $basedir"
exit
fi
}
#检查文件
check_file(){
if [[ ! -f $firt_args  ]];then
print_log "文件不存在: $firt_args"
exit
fi
}
#监控文件&restart
monitor_file(){
content=$(grep "$end_string" $firt_args)
if [[  -z $content  ]];then
print_log ""
print_log "没有找到结束标识,开始监控文件"
print_log  "开始检测文件更改时间."
utc_time=$(stat $firt_args |grep "Modify"  |awk -F'Modify:' '{print $2}')
microtime=$(date -d "$utc_time" +%s)
print_log  "等待$second秒..."
sleep $second
utc_time2=$(stat $firt_args |grep "Modify"  |awk -F'Modify:' '{print $2}')
microtime2=$(date -d "$utc_time2" +%s)
if [[  $microtime != $microtime2   ]];then
print_log   "文件:$firt_args ------$second秒后发生了变化->退出操作"
exit
fi 
if [[ ! -f $restart_file  ]];then
print_log  "服务控制脚本不存在:$restart_file "
exit
fi
print_log  "文件:$firt_args ------$second秒后文件更新时间相等."
print_log  "开始重启."
/bin/bash $restart_file   $third   $fourth $five $six
print_log  "重启完成."
else
print_log "找到结束标识,不需要监控文件."
fi
}
#主函数
run(){
#第一个参数的判断
if [[  "$1" != ""  ]];then
firt_args=$1
check_file 
else
echo -e "
 自动检测文件的md5值,经过N秒钟后,如果没变化就重启服务
 用法示例"
echo -e  "
$0:
   /bin/bash $0  要监控的文件 监控的时间(单位:秒)   应用的名称   应用的关键字    '执行启动的命令'     要做的动作  
exp:
   /bin/bash $0  "/data/log/policy-root-new-2/policy-root-new-2.\$\(date "+%Y-%m-%d"\).log"  10  policy-root-new-2   policy-root-new-2  '/data/www/apps/policy-root-new-2/bin/boxrun'  restart/stop/start
"
exit
fi 
#第二个参数的判断
if [[ $2 != ""  ]];then
second=$2
if [[ $second  -eq 0   ]];then
print_log "第二个参数,不能为0"
exit
fi 
else
print_log "第二个参数,不能为空"
exit
fi 
#第三个参数的判断
if [[ $3 != ""  ]];then
third=$3
else
print_log  "第三个参数,不能为空"
exit
fi
#第四个参数的判断
if [[ $4 != ""  ]];then
fourth=$4
else
print_log  "第四个参数,不能为空"
exit
fi
if [[ $5 != ""  ]];then
five=$5
else
print_log  "第五个参数,不能为空"
exit
fi
if [[ $6 != ""  ]];then
six=$6
else
print_log  "第六个参数,不能为空"
exit
fi
monitor_file
}
run $1 $2 $3 $4 $5 $6

坚持原创技术分享,您的支持将鼓励我继续创作!