监控日志文件的md5值/更新时间,如果N分钟后无变化则重启应用 发表于 2015-02-10 | 分类于 Shell相关 | | 阅读次数 | 字数统计 1,866 | 阅读时长 9 [执行语句如下:(可添加计划任务)] [[ ] 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 如下 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144#!/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 $logdirecho "[ $(datef) ] $1" >> $logfiif [[ $is_font -eq 1 ]];thenecho "[ $(datef) ] $1"fi}#检查目录check_dir(){if [[ ! -d $basedir ]];thenprint_log "目录不存在: $basedir"exitfi}#检查文件check_file(){if [[ ! -f $firt_args ]];thenprint_log "文件不存在: $firt_args"exitfi}#监控文件&restartmonitor_file(){content=$(grep "$end_string" $firt_args)if [[ -z $content ]];thenprint_log ""print_log "没有找到结束标识,开始监控文件"print_log "开始检测文件md5值."md5_value=$(md5sum $firt_args |awk '{print $1}')print_log "等待$second秒..."sleep $secondmd5_next_value=$(md5sum $firt_args |awk '{print $1}')if [[ $md5_next_value != $md5_value ]];thenprint_log "文件:$firt_args ------$second秒后发生了变化->退出操作"exitfiif [[ ! -f $restart_file ]];thenprint_log "服务控制脚本不存在:$restart_file "exitfiprint_log "文件:$firt_args ------$second秒后md5值相等."print_log "开始重启."/bin/bash $restart_file $third $fourth $five $sixprint_log "重启完成."elseprint_log "找到结束标识,不需要监控文件."fi}#主函数run(){#第一个参数的判断if [[ "$1" != "" ]];thenfirt_args=$1check_file elseecho -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"exitfi #第二个参数的判断if [[ $2 != "" ]];thensecond=$2if [[ $second -eq 0 ]];thenprint_log "第二个参数,不能为0"exitfi elseprint_log "第二个参数,不能为空"exitfi #第三个参数的判断if [[ $3 != "" ]];thenthird=$3elseprint_log "第三个参数,不能为空"exitfi#第四个参数的判断if [[ $4 != "" ]];thenfourth=$4elseprint_log "第四个参数,不能为空"exitfiif [[ $5 != "" ]];thenfive=$5elseprint_log "第五个参数,不能为空"exitfiif [[ $6 != "" ]];thensix=$6elseprint_log "第六个参数,不能为空"exitfimonitor_file}run $1 $2 $3 $4 $5 $6 1run.sh 如下 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174#!/bin/bash# chkconfig: 2345 93 11# description:$INS_APP Server. /etc/rc.d/init.d/functionsJAVA_HOME="/usr/local/jdk"PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:$JAVA_HOME/binis_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}#查找进程idcheck_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 1esacelseprint_log "第四个参数,不能为空"exitfi}run $1 $2 $3 $4 效果图: 监控文件的更新时间: 1check_modify.sh 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146#!/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 $logdirecho "[ $(datef) ] $1" >> $logfiif [[ $is_font -eq 1 ]];thenecho "[ $(datef) ] $1"fi}#检查目录check_dir(){if [[ ! -d $basedir ]];thenprint_log "目录不存在: $basedir"exitfi}#检查文件check_file(){if [[ ! -f $firt_args ]];thenprint_log "文件不存在: $firt_args"exitfi}#监控文件&restartmonitor_file(){content=$(grep "$end_string" $firt_args)if [[ -z $content ]];thenprint_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 $secondutc_time2=$(stat $firt_args |grep "Modify" |awk -F'Modify:' '{print $2}')microtime2=$(date -d "$utc_time2" +%s)if [[ $microtime != $microtime2 ]];thenprint_log "文件:$firt_args ------$second秒后发生了变化->退出操作"exitfi if [[ ! -f $restart_file ]];thenprint_log "服务控制脚本不存在:$restart_file "exitfiprint_log "文件:$firt_args ------$second秒后文件更新时间相等."print_log "开始重启."/bin/bash $restart_file $third $fourth $five $six print_log "重启完成."elseprint_log "找到结束标识,不需要监控文件."fi}#主函数run(){#第一个参数的判断if [[ "$1" != "" ]];thenfirt_args=$1check_file elseecho -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"exitfi #第二个参数的判断if [[ $2 != "" ]];thensecond=$2if [[ $second -eq 0 ]];thenprint_log "第二个参数,不能为0"exitfi elseprint_log "第二个参数,不能为空"exitfi #第三个参数的判断if [[ $3 != "" ]];thenthird=$3elseprint_log "第三个参数,不能为空"exitfi#第四个参数的判断if [[ $4 != "" ]];thenfourth=$4elseprint_log "第四个参数,不能为空"exitfiif [[ $5 != "" ]];thenfive=$5elseprint_log "第五个参数,不能为空"exitfiif [[ $6 != "" ]];thensix=$6elseprint_log "第六个参数,不能为空"exitfimonitor_file}run $1 $2 $3 $4 $5 $6 坚持原创技术分享,您的支持将鼓励我继续创作! 赏 微信打赏