计划任务添加如下:
每隔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
效果图:
时间: 2024-10-10 06:32:19