检测日志文件的md5值如果N分钟后无变化则重启应用

计划任务添加如下:

每隔10分钟检测一次

*/10 * * * * /bin/bash /data/scripts/check_md5sum.sh  /data/log/policy-root-new-4/policy-root-new-4.$(date +%Y-%m-%d).log    300   policy-root-new-4   policy-root-new-4  ‘/data/www/apps/policy-root-new-4/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

#动态数据时间 
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(){
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		

}

#主函数
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/e=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

效果图:

时间: 02-10

检测日志文件的md5值如果N分钟后无变化则重启应用的相关文章

计算文件的MD5值(Java & Rust)

Java public class TestFileMD5 { public final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b",

改变文件的MD5值

有时我们上传视频到youtube由于md5雷同不能上传, 我们需要下载MD5Checker来查询文件的md5值 链接:http://pan.baidu.com/s/1qWkpyG0 密码:3frx 编辑-打开文件,即可查看文件MD5 新建文件夹 命名为md5 把要改变md5的文件拖进来 如上123.rmvb就是我们要改动的文件 在文件夹中新建MD5.txt 输入1然后保存 关闭 在文件夹中新建ChangeMD5.txt 输入 FOR %%1 in (*.rmvb) do COPY %%1+MD5

linux shell 命令获取字符串/文件的MD5值

获取字符串的MD5值: 字符串"hello"的MD5: $ echo -n 'hello'|md5sum|cut -d ' ' -f1 得到的MD5值: 5d41402abc4b2a76b9719d911017c592 命令解释: md5sum: 显示或检查 MD5(128-bit) 校验和,若没有文件选项,或者文件处为"-",则从标准输入读取. echo -n : 不打印换行符. cut:  cut用来从标准输入或文本文件中剪切列或域.剪切文本可以将之粘贴到一个文

Python计算一个目录下的所有文件的md5值,在Linux系统下面

实现代码如下: #!/usr/bin/python #*-*coding:utf8*-* import os import sys import hashlib def md5sum(data):     with open(data, "rb") as f:         md5 = hashlib.md5()     #赋空值         for i in f.read(4096):    #防止遇到大文件打开太占用内存,所以一次打开4096字节             if

文件md5值是否正确的api接口开发

利用web.py框架,判断服务器端的某文件的md5值是否正确.返回json格式数据,代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- # Author:     feng minqiang  <[email protected]> # Maintainer:  feng minqiang  <[email protected]> import web import hashlib import os,sys #简单的测试一个字符

遍历目录删除指定MD5值的文件

工作需要实现一个查找出指定目录下md5值与excel表格中md5值相同的文件然后删掉的功能.我是这样做的:首先遍历指定目录,计算该目录下所有文件的md5值,以文件路径为key,md5值为value保存到一个字典中:然后读取excel表格中的md5,查看字典中的value是否包含该md5,如果包含,则删除对应文件.以下是具体实现代码: 1 #coding:utf-8 2 3 from hashlib import md5 4 import os,time,sys 5 import xlrd 6 i

MySQL日志文件与分析

1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记录 可以指定输出为表 二进制日志 log_bin 记录可能执行更改的所有操作 mysqlbinlog查看 2.日志的分析 2.1日志的存储 数据操作过程中,Mysqld是将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中.一条一条就类似这样: # Time: 070927 8:08:

利用os、hash模块生成目录下所有文件的md5

hashlib用于对字符串或者文件进行加密. 使用方法1: hashlib.md5('str').hexdigest() 使用MD5对str进行加密,使用hexdigest(),16进制的方式打印 使用方法2: md5 = hashlib.md5() md5.update('hello') 如果第一次执行update,那么就是对hello这个字符串进行MD5加密(注意,这里是累加,如果多次update,那么求得是累加的md5值) md5.hexdigest() 把md5对象保存的str,以16进

【Unity3D】使用MD5值,确保本地Sqlite数据库内容没有被篡改

Sqlite的应用场景 在判断是否使用存储格式为Sqlite模式的标准,我们的标准是内容只读.也就是说,除非发布者修改Sqlite内容,玩家只有读取的权限. 换个角度说,Sqlite里面的数据都是游戏基础配置数据,比如游戏的关卡(不包括玩家取得的成就).怪物的血量.装备的模板数据 对于如何使用Sqlite,请参考我的另外一篇文章<Unity本地数据存储---Sqlite和JSON> 问题重现 OK,既然我们选择了Sqlite作为存储手段之一,那么我们也嘚重视起安全性. 以android而言,我