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

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

用脚本就可以搞定的! 当发现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

发现这个太多了复制下别人写的

# uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令

# head -n 1 /etc/issue # 查看操作系统版本,是数字1不是字母L

# cat /proc/cpuinfo # 查看CPU信息的linux系统信息命令

# hostname # 查看计算机名的linux系统信息命令

# lspci -tv # 列出所有PCI设备

# lsusb -tv # 列出所有USB设备的linux系统信息命令

# lsmod # 列出加载的内核模块

# env # 查看环境变量资源

# free -m # 查看内存使用量和交换区使用量

# df -h # 查看各分区使用情况

# du -sh # 查看指定目录的大小

# grep MemTotal /proc/meminfo # 查看内存总量

# grep MemFree /proc/meminfo # 查看空闲内存量

# uptime # 查看系统运行时间、用户数、负载

# cat /proc/loadavg # 查看系统负载磁盘和分区

# mount | column -t # 查看挂接的分区状态

# fdisk -l # 查看所有分区

# swapon -s # 查看所有交换分区

# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)

# dmesg | grep IDE # 查看启动时IDE设备检测状况网络

# ifconfig # 查看所有网络接口的属性

# iptables -L # 查看防火墙设置

# route -n # 查看路由表

# netstat -lntp # 查看所有监听端口

# netstat -antp # 查看所有已经建立的连接

# netstat -s # 查看网络统计信息进程

# ps -ef # 查看所有进程

# top # 实时显示进程状态用户

# w # 查看活动用户

# id # 查看指定用户信息

# last # 查看用户登录日志

# cut -d: -f1 /etc/passwd # 查看系统所有用户

# cut -d: -f1 /etc/group # 查看系统所有组

# crontab -l # 查看当前用户的计划任务服务

# chkconfig –list # 列出所有系统服务

# chkconfig –list | grep on # 列出所有启动的系统服务程序

# rpm -qa # 查看所有安装的软件包

# cat /proc/cpuinfo # 查看CPU相关参数的linux系统命令

# cat /proc/partitions # 查看linux硬盘和分区信息的系统信息命令

# cat /proc/meminfo # 查看linux系统内存信息的linux系统命令

# cat /proc/version # 查看版本,类似uname -r

# cat /proc/ioports # 查看设备io端口

# cat /proc/interrupts # 查看中断

# cat /proc/pci # 查看pci设备的信息

# cat /proc/swaps # 查看所有swap分区的信息


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/807042.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-29
下一篇2023-08-29

发表评论

登录后才能评论

评论列表(0条)

    保存