网站首页学无止境LINUX

Linux 进程自动监控shell脚本

发布时间:2014-10-24 22:28:38编辑:songlin阅读(78)

    主要用于监控 linux 服务器负载及内存占用,当负载或内存占用达到设置值后,便自动重启该进程以避免宕机。

    一、使用方法

    下载、解压、运行

    1. wget http://wangyan.org/download/script/pid_auto_reboot.tar.gz 
    2. tar -zxf pid_auto_reboot.tar.gz 
    3. ./pid_auto_reboot.sh 

    设置每分钟执行一次

    1. crontab -e 
    2. * * * * * /bin/bash  /var/shell/pid_auto_reboot.sh 

    二、原理解释

    1. # 设置最大内存占用百分比 
    2. PID_MEM_MAX="85" 
    3.  
    4. # 设置最大系统负载 
    5. SYS_LOAD_MAX="3" 
    6.  
    7. # 设置需要监控的服务名称 
    8. NAME_LIST="php-fpm mysql" 
    9.  
    10. for NAME in $NAME_LIST 
    11. do 
    12.     # 初始化内存统计 
    13.     PID_MEM_SUM=0 
    14.  
    15.     # 获取该程序总进程数 
    16.     PID_NUM_SUM=`ps aux | grep $NAME | wc -l` 
    17.  
    18.     # 列出每个进程内存占用百分比 
    19.     PID_MEM_LIST=`ps aux | grep $NAME | awk '{print $4}'
    20.  
    21.     # 计算所有进程总内存占用 
    22.     for PID_MEM in $PID_MEM_LIST 
    23.     do 
    24.         PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc` 
    25.     done 
    26.      
    27.     # 获取最近一分钟系统负载 
    28.     SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'
    29.  
    30.     # 比较内存占用和系统负载是否超过阀值 
    31.     MEM_VULE=`awk 'BEGIN{print('"$PID_MEM_SUM"'>='"$PID_MEM_MAX"'?"1":"0")}'
    32.     LOAD_VULE=`awk 'BEGIN{print('"$SYS_LOAD"'>='"$SYS_LOAD_MAX"'?"1":"0")}'
    33.  
    34.     # 如果系统内存占用和系统负载超过阀值,则进行下面操作。 
    35.     if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then 
    36.         #  写入日志 
    37.         echo $(date +"%y-%m-%d %H:%M:%S""killall $NAME" "(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)">> /var/log/autoreboot.log 
    38.         # 正常停止服务 
    39.         /etc/init.d/$NAME stop 
    40.         sleep 3 
    41.         # 强制关闭 
    42.         pkill $NAME 
    43.  
    44.        #  重启 
    45.         /etc/init.d/$NAME start 
    46.        #写入日志 
    47.         echo $(date +"%y-%m-%d %H:%M:%S""start $NAME" "(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)" >> /var/log/autoreboot.log 
    48.     else 
    49.         echo "$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)" > /dev/null 
    50.     fi 
    51. done