容器技术交流

 找回密码
 立即注册
查看: 4376|回复: 4

VPS自动监控Shell脚本

[复制链接]
发表于 2011-11-27 21:55:49 | 显示全部楼层 |阅读模式
本帖最后由 linji 于 2011-12-12 00:54 编辑

希望能够修改成适用于LUM的脚本。

该脚本用于监控VPS服务器负载,Web程序内存及CPU使用。当服务器系统负载或内存使用达到预设值,则重启该程序,或者某个php-cgi进程占用CPU过大,则直接kill掉该进程。目的在于缓解服务器资源耗尽导致意外宕机等情况。


https://gist.github.com/1216837


已经有高手修改成功,详细请看

sys-mon.rar (2.15 KB, 下载次数: 3122)

使用时,根据自己的情况修改以下几处地方。

# 测试站点是否正常运行的url
MY_URL="http://xxxx/"

# 指定当前使用的服务器网卡
NETWORK_CARD="eth0"

# 通知邮件地址
EMAIL="xxx@139.com"

#发送方式 0:系统mail 1:第三方代发

SENDMAIL_TYPE="0";


1.vi /var/script/sys-mon.sh

2.点键盘i键

3.粘贴脚本内容(见帖子下方)

4.点击ESC

5.输入:wq 回车

6.chmod +x /home/monitor.sh

7.设置每分钟执行一次
crontab -e
* * * * *   /var/script/sys-mon.sh

vi /usr/local/LuNamp/cmd/crontab_cmd.sh

* * * * *  /var/script/sys-mon.sh
  1. #! /bin/bash
  2. #====================================================================
  3. # sys-mon.sh
  4. #
  5. # Copyright (c) 2011, WangYan <webmaster@wangyan.org>
  6. # All rights reserved.
  7. # Distributed under the GNU General Public License, version 3.0.
  8. #
  9. # Monitor system mem and load, if too high, restart some service.
  10. #
  11. # See: https://wangyan.org/blog/sys-mon-shell-script.html
  12. #
  13. # V 2, since 2011-09-14
  14. #====================================================================

  15. # Need to monitor the service name
  16. NAME_LIST="php-fpm mysql nginx"

  17. # Single process to allow the maximum CPU (%)
  18. PID_CPU_MAX="20"

  19. # The maximum allowed memory (%)
  20. SYS_MEM_MAX="90"

  21. # The maximum allowed system load
  22. SYS_LOAD_MAX="5"

  23. # Log path settings
  24. LOG_PATH="/var/log/autoreboot.log"

  25. # Date time format setting
  26. DATA_TIME=$(date +"%y-%m-%d %H:%M:%S")

  27. # Your email address
  28. EMAIL="webmaster@wangyan.org"

  29. # Your website url
  30. MY_URL="https://wangyan.org/blog"

  31. #====================================================================

  32. for NAME in $NAME_LIST
  33. do
  34.     SYS_CPU_SUM="0";SYS_MEM_SUM="0"
  35.     PID_LIST=`ps aux | grep $NAME | grep -v root`

  36.     IFS_TMP="$IFS";IFS=


  37. \n'
  38.     for PID in $PID_LIST
  39.     do
  40.         PID_NUM=`echo $PID | awk '{print $2}'`
  41.         PID_CPU=`echo $PID | awk '{print $3}'`
  42.         PID_MEM=`echo $PID | awk '{print $4}'`
  43. #       echo $NAME: $PID_NUM $PID_CPU $PID_MEM

  44. #       SYS_CPU_SUM=`echo $SYS_CPU_SUM + $PID_CPU | bc`
  45.        SYS_MEM_SUM=`echo $SYS_MEM_SUM + $PID_MEM | bc`

  46.         if [[ "$NAME" = "php-fpm" && "$PID_CPU" > "$PID_CPU_MAX" ]];then
  47.             echo "$DATA_TIME kill $PID_NUM successful (CPU:$PID_CPU)" | tee -a $LOG_PATH
  48.             kill $PID_NUM
  49.         fi
  50.     done
  51.     IFS="$IFS_TMP"

  52.     SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
  53.     MEM_COMPARE=`awk 'BEGIN{print('$SYS_MEM_SUM'>'$SYS_MEM_MAX')}'`
  54.     LOAD_COMPARE=`awk 'BEGIN{print('$SYS_LOAD'>'$SYS_LOAD_MAX')}'`
  55. #   echo -e "$NAME: CPU_SUM:$SYS_CPU_SUM MEM_SUM:$SYS_MEM_SUM SYS_LOAD:$SYS_LOAD\n"

  56.     for ((i=0;i<3;i++))
  57.     do
  58.         STATUS_CODE=`curl -o /dev/null -s -w %{http_code} $MY_URL`
  59.         if [ "$STATUS_CODE" = "200" ];then
  60.             break
  61.         fi
  62.     done

  63.     if [[ "$MEM_COMPARE" = "1" || "$LOAD_COMPARE" = "1" || "$STATUS_CODE" = "502" ]];then
  64.         /etc/init.d/$NAME stop
  65.         if [ "$?" = "0" ];then
  66.             echo "$DATA_TIME Stop $NAME successful (MEM:$SYS_MEM_SUM CPU:$SYS_CPU_SUM LOAD:$SYS_LOAD)" | tee -a $LOG_PATH
  67.         else
  68.             echo "$DATA_TIME Stop $NAME [failed] (MEM:$SYS_MEM_SUM CPU:$SYS_CPU_SUM LOAD:$SYS_LOAD)" | tee -a $LOG_PATH
  69.             sleep 3
  70.             pkill $NAME
  71.         fi
  72.         /etc/init.d/$NAME start
  73.         if [ "$?" = "0" ];then
  74.             echo "$DATA_TIME Start $NAME successful" | tee -a $LOG_PATH
  75.         else
  76.             echo "$DATA_TIME Start $NAME [failed]" | tee -a $LOG_PATH
  77.             echo "$DATA_TIME Start $NAME failed" | mail -s "Start $NAME failed" $EMAIL
  78.         fi
  79.     fi

  80. done
复制代码


发表于 2011-11-28 10:17:07 | 显示全部楼层
学习中...........
发表于 2011-12-3 23:08:58 | 显示全部楼层
{:soso_e179:}谢谢分享,很好的东西
发表于 2011-12-8 02:00:46 | 显示全部楼层
很给力,但是我目前的主机是apache的,nginx的服务我至今没用过,请问对apache的进程能否监控?
发表于 2011-12-29 08:59:43 | 显示全部楼层
不错不错,支持一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Archiver|URLOS ( 粤ICP备18087780号 )

GMT+8, 2025-5-16 02:06 , Processed in 0.030474 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表