嵌入式Linux系统下 如何在CPU占用率过高的时候重启

如题所述

  用脚本就可以搞定的! 当发现CPU占用率过高时,会自动重启相关程序。。

# è®¾ç½®æœ€å¤§å†…存占用百分比
PID_MEM_MAX=”85″
# è®¾ç½®æœ€å¤§ç³»ç»Ÿè´Ÿè½½
SYS_LOAD_MAX=”1″
# è®¾ç½®éœ€è¦ç›‘控的服务名称
NAME_LIST=”php5-cgi mysql”
for NAME in $NAME_LIST
do
# åˆå§‹åŒ–内存统计
PID_MEM_SUM=0
# èŽ·å–该程序总进程数
PID_NUM_SUM=`ps aux | grep $NAME | wc -l`
# åˆ—出每个进程内存占用百分比
PID_MEM_LIST=`ps aux | grep $NAME | awk â€˜{print $4}’`
# è®¡ç®—所有进程总内存占用
for PID_MEM in $PID_MEM_LIST
do
PID_MEM_SUM=`echo $PID_MEM_SUM + $PID_MEM | bc`
done
# èŽ·å–最近一分钟系统负载
SYS_LOAD=`uptime | awk â€˜{print $(NF-2)}’ | sed â€˜s/,//’`
# æ¯”较内存占用和系统负载是否超过阀值
    MEM_VULE=`awk â€˜BEGIN{print(‘”$PID_MEM_SUM”‘>=’”$PID_MEM_MAX”‘?”1″:”0″)}’`
    LOAD_VULE=`awk â€˜BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`
# å¦‚果系统内存占用和系统负载超过阀值,则进行下面操作。
    if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# å†™å…¥æ—¥å¿—
    echo $(date +”%y-%m-%d %H:%M:%S”) â€œkillall $NAME” â€œ(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# æ­£å¸¸åœæ­¢æœåŠ¡
    /etc/init.d/$NAME stop
    sleep 3
# å¼ºåˆ¶å…³é—­
    pkill $NAME
# é‡å¯
    /etc/init.d/$NAME start
#写入日志
    echo $(date +”%y-%m-%d %H:%M:%S”) â€œstart $NAME” â€œ(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
    else
    echo â€œ$NAME very health!(MEM:$PID_MEM_SUM,LOAD:$SYS_LOAD)” > /dev/null
    fi
    done
    ä»¥ä¸Šä»£ç ä¿å­˜ä¸ºä¸€ä¸ªæ–‡ä»¶ï¼Œä¾‹å¦‚:auto_reboot.sh
    æ·»åŠ è®¡åˆ’任务,设置每分钟检查一次(注意文件的位置要搞正确)
    crontab -e
    * * * * * /bin/bash/root/auto_reboot.sh
    è¯·ç¡®ä¿æ‚¨çš„Linux系统中已经安装了bc,否则会出现错误。查看是否安装了bc可以使用命令:
    bc -v
    å¦‚果没有安装,centos可以用 yum -y install bc å®‰è£…,然后执行命令:
    sh /bin/bash/root/auto_reboot.sh
    CentOS VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本:
# !/bin/sh
# usage: */2 * * * * root /root/checkload.sh
# [CentOS]VPS服务器根据CPU负载及内存占用自动重启脚本
# è®¾ç½®æœ€å°å‰©ä½™å†…存,一般至少要剩余50M可用(单位兆)
    FREE_MEM_MIN=”50″
# è®¾ç½®æœ€å¤§ç³»ç»Ÿè´Ÿè½½
    SYS_LOAD_MAX=”3″
# è®¾ç½®é‡å¯æœåŠ¡çš„最小剩余内存(单位兆)
    RESTART_FREE_MEM_MIN=”500″
# è®¾ç½®éœ€è¦ç›‘控的服务名称
    NAME_LIST=”httpd mysqld”
    for NAME in $NAME_LIST
    do
# èŽ·å¾—剩余内存(单位兆)
    FREE_MEM=`free -m|grep Mem|awk â€˜{print $4}’`
# èŽ·å¾—已用内存(单位兆)
#   FREE_MEM=`free -m|grep Mem|awk â€˜{print $3}’`
# èŽ·å–最近一分钟系统负载
    SYS_LOAD=`uptime | awk â€˜{print $(NF-2)}’ | sed â€˜s/,//’`
# æ¯”较内存占用和系统负载是否超过阀值
    MEM_VULE=`awk â€˜BEGIN{print(‘”$FREE_MEM”‘<’”$FREE_MEM_MIN”‘?”1″:”0″)}’`
    LOAD_VULE=`awk â€˜BEGIN{print(‘”$SYS_LOAD”‘>=’”$SYS_LOAD_MAX”‘?”1″:”0″)}’`
# æµ‹è¯•ç»“æžœ
# LOAD_VULE=”1″
# echo $(date +”%y-%m-%d %H:%M:%S”) â€œDEBUG $NAME”   â€œ(FREE_MEM:$FREE_MEM|$MEM_VULE,LOAD:$SYS_LOAD|$LOAD_VULE)”>> /var/log/autoreboot_debug.log
# å¦‚果系统内存占用和系统负载超过阀值,则进行下面操作。
    if [ $MEM_VULE = 1 ] || [ $LOAD_VULE = 1 ] ;then
# å†™å…¥æ—¥å¿—
    echo $(date +”%y-%m-%d %H:%M:%S”) â€œkillall $NAME” â€œ(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)”>> /var/log/autoreboot.log
# æ­£å¸¸åœæ­¢æœåŠ¡
    service $NAME stop
    sleep 3
# å¼ºåˆ¶å…³é—­
    skill $NAME
# é‡å¯
    sleep 10
    for i in 1 2 3
    do
    FREE_MEM=`free -m|grep Mem|awk â€˜{print $4}’`
    MEM_VULE=`awk â€˜BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
    if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
    then
    service $NAME start
    sleep 15
    echo â€œAutoStart:” $(date +”%y-%m-%d %H:%M:%S”) â€œstart $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
    fi
    done
# å†™å…¥æ—¥å¿—
    echo $(date +”%y-%m-%d %H:%M:%S”) â€œstart $NAME” â€œ(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” >> /var/log/autoreboot.log
    else
    MEM_VULE=`awk â€˜BEGIN{print(‘”$FREE_MEM”‘>=’”$RESTART_FREE_MEM_MIN”‘?”1″:”0″)}’`
    if [ `pgrep $NAME | wc -l` -le 0 ] && [ $MEM_VULE = 1 ]
    then
    service $NAME start
    sleep 15
    echo â€œAutoStart:” $(date +”%y-%m-%d %H:%M:%S”) â€œstart $NAME” `ps -ef | grep $NAME | wc -l` > /var/log/autoreboot.log
    else
    echo â€œ$NAME very health!(FREE_MEM:$FREE_MEM,LOAD:$SYS_LOAD)” > /dev/null
    fi
    fi
    done
温馨提示:答案为网友推荐,仅供参考
相似回答