shell学习-问题-感悟

213-09-06
今天碰到redis无故挂断后任务无法正常流转,造成任务积压,直接发现重启redis后才解决问题,问题是redis设置使用实体内存,不使用磁盘,而机器内存低不够分配跟redis而碰掉了,揪心啊,。后来想到应该有监控进程的程序,他的任务很简单:定时查询进程,如果不存在,则表明程序异常退出了,应该重启重启。利用这方法来监控我负责的storm程序的进程,如果进程挂掉了,可以立即起来,不影响任务流转。
在linux下面使用shell完成了一个极其简易的进程监控脚本,然后再定时任务中设置没个一段时间运行一次。
思路:
1.使用一个文件记录监控程序列表,实现监控配置化;
2.为每一个被监控的程序写一个启动程序的sh脚本,用于启动程序使用;
3.写一个脚本按行读取监控程序列表文件,获取程序名,对每个进程名逐个利用命令ps和grep查询进程,如果发现进程不存在,调用启动该进程的脚本文件,记录日志。

监控进程列表文件(一行一个进程名):process_names

backtype.storm.daemon.nimbus  
backtype.storm.ui.core  
org.apache.zookeeper.server.quorum.QuorumPeerMain  

在监控脚本中读取程序列表,然后使用ps -ef命令查询进程
监控脚本:monitor.sh

 #!/bin/sh  
 #监控指定目录下面process_names中的程序列表进程,如果无进程,启动进程  

 #监控日志
log_path="./monitor.log"
 #基路径
base_path="."  
 #程序列表文件  
process_names_path="$base_path/process_names"  
 #启动对应程序名  
process_exec_path="$base_path/process_exec"  

 #按行读取程序列表  
process_names=`cat $process_names_path | awk '{print $0"\n"}'`  
 #遍历数据  
for process_name in ${process_names[@]}  
do  
  #查询进程个数  
  procnum=$(ps -ef | grep $process_name | grep -v grep | wc -l)  
  #进程挂了  
  if [ $procnum -ne 1 ]  
  then  
   #日志记录  
    echo "`date` find $process_name crash...." >> $log_path  
    echo "`date` try start $process_name ...." >> $log_path  
    #拼接启动进程命令  
    exec_proc="$process_exec_path/$process_name.sh"  
    #启动进程  
    sh $exec_proc >>$log_path  
  fi  
done  

与监控进程列表对应的启动进程文件(一个程序一个启动文件):
process_exec/backtype.storm.daemon.nimbus.sh

 #!/bin/sh  
echo "starting backtype.storm.daemon.nimbus"  
/usr/local/storm/bin/storm nimbus > /dev/null 2>&1 &  

其他进程启动命令文件类似。
在定时任务中添加任务,编辑命令:crontab-e

*/3 * * * * sh /data/apps/monitor-storm/monitor.sh >/dev/null 2>&1  

完成后使用root用户重新加载定时任务配置文件
/etc/init.d/crond reload

故意干掉进程,测试结果

至此,一个极其简易,可配置监控程,没有通知功能的监控程序完成了,哈哈,乐一下…

在编写过程中遇到了不少苦难,到底还是shell知识不够的原因。
途中遇问题:
1.如何简易从监控程序列表中按行读取数据到一个数组中
google一会发现使用cat 和awk能够完成使命
2.是遍历监控程序列表数组
也是google完成了

刻画在blog中的目的是为了加深记忆,方便以后查阅,欢迎吐槽
注:由于用markdown编写,所有有些乱,而且字符被转义了,望谅

每天记一点,日后成宝典

你可能感兴趣的:(监控进程)