前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >监控日志文件的md5值/更新时间,如果N分钟后无变化则重启应用

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

作者头像
明哥的运维笔记
发布2019-01-30 10:03:13
1.3K0
发布2019-01-30 10:03:13
举报
文章被收录于专栏:运维笔记

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

监控更新时间:

代码语言:javascript
复制
 /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值:

代码语言:javascript
复制
/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
代码语言:javascript
复制
 check_md5sum.sh 如下
代码语言:javascript
复制
#!/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
代码语言:javascript
复制
run.sh 如下
代码语言:javascript
复制
#!/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

效果图:

监控文件的更新时间:

代码语言:javascript
复制
check_modify.sh
代码语言:javascript
复制
#!/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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档