执行语句如下:(可添加计划任务)
监控更新时间:
/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值:
/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
check_md5sum.sh 如下
#!/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
run.sh 如下
#!/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
效果图:
监控文件的更新时间:
check_modify.sh
#!/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