为什么80%的码农都做不了架构师?>>>   

引言:
一提强拉脚本,也许很多人觉得很简单,监控下现在进程在不在,不在就拉起来,三两句shell搞定
是的,大体是如此简单的。但这里所介绍的强拉监控脚本比上面这个稍稍复杂些。
背景:
公司某业务重新做,积累多年,由多人轮换维护过的日志工作需要交接,很多机器到了退役期,宕机,进程抗不住挂掉,磁盘满服务没法用,各种问题不断涌来,光处理这些问题已经耗费太多精力,何谈优化,重构... 于是就得先把尽可能繁琐的运维工作hold住,在很难短期内熟悉的情况下,强拉脚本不失为一种有效的选择。
需求:
监控进程,如果不存在则启动之,如果宕机,则重启后依然能够拉起进程。
分析:
宕机恢复必然使用crontab,监控要么常驻进程循环,要么定时启动,依然离不开crontab。
使用:
如何路径下执行,一个脚本,两个函数,两个参数
crontab添加: * * * * * /data2/slog/bin/deamon_crontab.sh checkScript=/data2/slog/bin/check_proxy_stat.sh failCheckAction=/data2/slog/bin/restart_proxy_stat.sh rtx=peterguo
参数
checkScript:检查脚本,退出0表示检查成功,否则失败,失败则执行failCheckAction所示脚本
failCheckAction:失败后动作脚本,执行成功则
rtx:告警收信息人姓名(自省修改是手机还是rtx)
备注:
参数中的脚本必须使用绝对路径,否则后果自负(比如你使用了rm *)
参数中的脚本必须符合“成功exit0,否则非零”的原则,否则报警多了不负责
体验1:(日志生成在与监控脚本同目录,名为: deamon_crontab.run.log)
检查脚本返回成功,直接退出
./deamon_crontab.sh checkScript=/bin/date failCheckAction=/bin/date rtx=你的rtx
检查脚步返回失败,执行后续动作成功
./deamon_crontab.sh checkScript=/proc/meminfo failCheckAction=/bin/date rtx=你的rtx
检查脚步返回失败,执行后续动作失败,rtx提示
./deamon_crontab.sh checkScript=/proc/meminfo failCheckAction=/proc/meminfo rtx=你的rtx
上脚本:

#! /bin/bash    #####################################################
#name           : deamon_crontab.sh
#note           : to deamon some process and execuate some action
#date           : 2013.01.10
#author         : <peterguo@tencent.com>
####################################################   CurFullScript=$(readlink /proc/$$/fd/255)
CurScriptPath=$(dirname $CurFullScript)
CurScriptName=$(basename $CurFullScript)
FullParam=$*
CurPid=$$
IPS=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2}' | cut -c 6- | awk '{printf("%s ", $0)}')
CurRunLog=$(dirname $CurFullScript)/$(echo $CurScriptName | cut -d . -f1).run.log   AnotherProcessNum=$(ps -ef | grep $CurScriptName | grep -v $CurPid | grep -v grep | wc -l)
if [ $AnotherProcessNum -ne 0 ];
then       echo "Another process is running, exit "       exit 1
fi   #If exist, import some basic shell function, here colorEcho
source ~/bin/basicfunction.sh 2>/dev/null
if [ $? -eq 1 ];
then   function colorEcho(){   colorFmtTail='\033[m'  greenFmtHead='\033[1;32m'  echo -e ${greenFmtHead}${2}${colorFmtTail}   }
fi   function usage(){   colorEcho red "Usage : /path/$(basename $0) checkScript=/data/check.sh failCheckAction=/data/restart.sh rtx=rtxguo"  colorEcho red "Note  : 1.checkScript[0-succ other-fail] 2.failCheckAction[execuat onlyif checkScript fail] 3.assert script full path from / and exist"  echo ""  exit 1
}   #Reslove the param, format name=value -> $name and check parameter validation
echo $* | grep checkScript | grep failCheckAction 2>/dev/null
[[ $? -ne 0 ]] && {
usage
}   eval "valTmp=Temp $*" 2>/dev/null
paramValid=$?   [[ "x" == "x$checkScript" ]] && {
paramValid=$(( $paramValid + 1 ))
}
echo ${checkScript}x | grep ^/ >/dev/null 2>&1
paramValid=$(( $paramValid + $? ))
ls ${checkScript} >/dev/null 2>&1
paramValid=$(( $paramValid + $? ))   [[ "x" == "x$failCheckAction" ]] && {
paramValid=$(( $paramValid + 1 ))
}
echo ${failCheckAction}x | grep ^/ >/dev/null 2>&1
paramValid=$(( $paramValid + $? ))
ls ${failCheckAction} >/dev/null 2>&1
paramValid=$(( $paramValid + $? ))   if [ $# -ne 3 ] || [ $paramValid -ne 0 ];
then   usage
fi
chmod +x $checkScript $failCheckAction 2>/dev/null   #Enter Execuate path
cd $CurScriptPath  #Display the Current Environment Values
echo "[$CurPid][$CurScriptPath][$CurScriptName][$FullParam]"  function runScript(){
strCommand=$1
$strCommand
return $?
}   colorEcho green "------------------------------check output begin -------------------------------------"
runScript $checkScript
checkRet=$?
colorEcho green "------------------------------check output end ---------------------------------------"  if [ $checkRet -eq 0 ];
then   colorEcho green "$(basename $0):$LINENO Check PASS [$(date +"%Y-%m-%d %H:%M:%S")]"    colorEcho green "$(basename $0):$LINENO Check PASS [$(date +"%Y-%m-%d %H:%M:%S")]" >> $CurRunLog
else  colorEcho red "$(basename $0):$LINENO Check FAIL [$(date +"%Y-%m-%d %H:%M:%S")]"  colorEcho red "$(basename $0):$LINENO Check FAIL [$(date +"%Y-%m-%d %H:%M:%S")]" >> $CurRunLog  colorEcho green "------------------------------failaction output begin -------------------------------------"  #execuate action script   runScript $failCheckAction     actionRet=$?   colorEcho green "------------------------------failaction output end ---------------------------------------"  [[ $actionRet -ne 0 ]] && {   colorEcho red "ERROR: Check Fail and Action Fail"  /usr/bin/env sendrtx peterguo $rtx ERROR "[deamon-monitor-error][$IPS:$CurFullScript:$LINENO][@peterguo]" 0   exit 1   colorEcho red "$(basename $0):$LINENO Action FAIL [$(date +"%Y-%m-%d %H:%M:%S")]"    colorEcho red "$(basename $0):$LINENO Action FAIL [$(date +"%Y-%m-%d %H:%M:%S")]" >> $CurRunLog  }   colorEcho red "$(basename $0):$LINENO Action PASS [$(date +"%Y-%m-%d %H:%M:%S")]"    colorEcho red "$(basename $0):$LINENO Action PASS [$(date +"%Y-%m-%d %H:%M:%S")]" >> $CurRunLog
fi

转载于:https://my.oschina.net/sanpeterguo/blog/101612

很简单却很实用的强拉脚本相关推荐

  1. EL表达式中fn函数的强大功能,很简单,很好用,很强大

    很简单,很强大,EL表达式中fn函数的强大功能,比如举个例子,要计算某个对象中的某个集合的大小,直接用EL表达式就可以计算出来-- ${fn:length(clazze.course)} 使用fn函数 ...

  2. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

  3. python好学实用吗-都说python很简单 真的很好学么?

    Python是一个非常适合初学者入门的编程语言.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易. Python为什么适合零基础小白 1.易于学习:Python有相对较少的关键字,结构简单 ...

  4. python编程难吗-都说python很简单 真的很好学么?

    Python是一个非常适合初学者入门的编程语言.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易. Python为什么适合零基础小白 1.易于学习:Python有相对较少的关键字,结构简单 ...

  5. 手把手教你在STM32上实现OLED视频播放(很简单也很硬很肝!)

    之前发了一个视频,今天就来告诉大家怎么来实现: 小熊派刷儿子骑摩的的抖音视频,流畅度666666 我们这一代的年轻人基本上都很喜欢逛B站,大部分老人都认为我们这些年轻人上B站是为了看动漫.看游戏等等, ...

  6. 一道很简单却也很容易入坑的java面试题

    直接上题:以下代码将打印出 public static void main (String[] args) { String classFile = "com.jd.". repl ...

  7. ubuntu安装声卡驱动,很简单,很详细,不是我写的。。。

    http://nkevin.blog.163.com/blog/static/448194812009428811196/

  8. 用JavaScript写的俄罗斯方块小游戏(很简单,很详细)

    效果 编写外部框架 <!DOCTYPE html> <html><head lang="en"><meta charset="U ...

  9. ae绘图未指定错误怎么办_【教程】最全的ae表达式教学分享(实用!)表达式其实很简单...

    大部分人对ae表达式是望而却之,感觉很难,无从下手,网上的教程也是层次不齐,很难找到好的教程跟着学.于是呢,搜罗全网,整理了一份最全的最实用的ae表达式教学.也算是一个对自己的总结. 下面解决几个问题 ...

最新文章

  1. python画简单花-Python竟能画这么漂亮的花,帅呆了(代码分享)
  2. python库--tensorflow--RNN(循环神经网络相关)
  3. au vst插件_失真效果音频插件
  4. java 断点续传组件_chunkupload 文件上传断点续传组件(java) - 正式发布
  5. 对象的多数组表示(不一样的链表-多数组表示链表)
  6. Sentinel集群流控
  7. python如何输出结果_如何在python2.7中打印输出结果?
  8. Linux应用程序在内存中的地址布局
  9. 三月数据库技术通讯.pdf | Oracle配置DCD避免会话被防火墙强制断开
  10. 微服务升级_SpringCloud Alibaba工作笔记0010---Gateway配置动态路由
  11. 关于魔方里的工具修改方法
  12. Oracle中OEM的启动与关闭
  13. JavaScript常见设计模式梳理
  14. Android进阶学习方法总结(内附阿里P7进阶学习全套资料)
  15. 计算机主机外接电源,电脑DIY必修课,电源接口详解
  16. eslint 如何关闭检查变量名规范或者大小写检查
  17. 工作流程管理的重要性
  18. seo技巧,seo技巧搜行者SEO
  19. 福利福利!!!!!!!!往这看!!!!!
  20. MM-DD-RRRR / MM-DD-YYYY 的区别 (Date format)

热门文章

  1. 初始化触发点击事件_【Vue原理】Event - 源码版 之 自定义事件
  2. 64位php oracle,64位系统无法加载PHP的oracle扩展问题
  3. 1080解析 芒果tv_国内主流视频平台解析下载观看
  4. android 6.0 自定义application,Android6.0之App中的资源管理对象创建
  5. Vivado 随笔(3) 其他综合属性 dont_touch、fsm_encoding?
  6. 【 FPGA 】常数( localparam )和参数( parameter )
  7. 【 MATLAB 】DFS 与 z 变换之间的关系
  8. 算法笔记1-排序-插入排序
  9. UVa 164 - String Computer
  10. Merge into 详细介绍