Guest User

Untitled

a guest
May 17th, 2012
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. #! /bin/bash
  2. #====================================================================
  3. # sys-mon.sh
  4. #
  5. # Copyright (c) 2011, WangYan <[email protected]>
  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 0.5, Date: 2011-12-08
  14. #====================================================================
  15.  
  16. # Need to monitor the service name
  17. # Must be in /etc/init.d folder exists
  18. NAME_LIST="httpd nginx mysql"
  19.  
  20. # Single process to allow the maximum CPU (%)
  21. PID_CPU_MAX="25"
  22.  
  23. # The maximum allowed memory (%)
  24. PID_MEM_SUM_MAX="95"
  25.  
  26. # The maximum allowed system load
  27. SYS_LOAD_MAX="6"
  28.  
  29. # Log path settings
  30. LOG_PATH="/var/log/sys-mon.log"
  31.  
  32. # Date time format setting
  33. DATA_TIME=$(date +"%y-%m-%d %H:%M:%S")
  34.  
  35. # Your email address
  36.  
  37. # Your website url
  38. MY_URL="http://106.187.38.210/p.php"
  39.  
  40. #====================================================================
  41.  
  42. for NAME in $NAME_LIST
  43. do
  44. PID_CPU_SUM="0";PID_MEM_SUM="0"
  45. PID_LIST=`ps aux | grep $NAME | grep -v root`
  46.  
  47. IFS_TMP="$IFS";IFS=$'\n'
  48. for PID in $PID_LIST
  49. do
  50. PID_NUM=`echo $PID | awk '{print $2}'`
  51. PID_CPU=`echo $PID | awk '{print $3}'`
  52. PID_MEM=`echo $PID | awk '{print $4}'`
  53. # echo "$NAME: PID_NUM($PID_NUM) PID_CPU($PID_CPU) PID_MEM($PID_MEM)"
  54.  
  55. PID_CPU_SUM=`echo "$PID_CPU_SUM + $PID_CPU" | bc`
  56. PID_MEM_SUM=`echo "$PID_MEM_SUM + $PID_MEM" | bc`
  57.  
  58. if [ `echo "$PID_CPU >= $PID_CPU_MAX" | bc` -eq 1 ];then
  59. if [[ "$NAME" = "php-fpm" || "$NAME" = "httpd" ]];then
  60. sleep 5
  61. if [ `echo "$PID_CPU >= $PID_CPU_MAX" | bc` -eq 1 ];then
  62. echo "${DATA_TIME}: kill ${NAME}($PID_NUM) successful (CPU:$PID_CPU)" | tee -a $LOG_PATH
  63. kill $PID_NUM
  64. fi
  65. else
  66. echo "${DATA_TIME}: [WARNING!] ${NAME}($PID_NUM) cpu usage is too high! (CPU:$PID_CPU)" | tee -a $LOG_PATH
  67. fi
  68. fi
  69. done
  70. IFS="$IFS_TMP"
  71.  
  72. SYS_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
  73. SYS_MON="CPU:$PID_CPU_SUM MEM:$PID_MEM_SUM LOAD:$SYS_LOAD"
  74. # echo -e "$NAME: $SYS_MON\n"
  75.  
  76. SYS_LOAD_TOO_HIGH=`awk 'BEGIN{print('$SYS_LOAD'>'$SYS_LOAD_MAX')}'`
  77. PID_MEM_SUM_TOO_HIGH=`awk 'BEGIN{print('$PID_MEM_SUM'>'$PID_MEM_SUM_MAX')}'`
  78.  
  79. if [[ "$SYS_LOAD_TOO_HIGH" = "1" || "$PID_MEM_SUM_TOO_HIGH" = "1" ]];then
  80. /etc/init.d/$NAME stop
  81. sleep 5
  82. for ((i=1;i<4;i++))
  83. do
  84. if [ `pgrep $NAME | wc -l` = "0" ];then
  85. echo "$DATA_TIME: Stop $NAME successful! ($SYS_MON)" | tee -a $LOG_PATH
  86. break
  87. else
  88. echo "${DATA_TIME}: [WARNING!] Stop $NAME failed[$i]! ($SYS_MON)" | tee -a $LOG_PATH
  89. pkill $NAME && killall $NAME
  90. fi
  91. done
  92. /etc/init.d/$NAME start
  93. sleep 5
  94. for ((ii=1;ii<4;ii++))
  95. do
  96. if [ `pgrep $NAME | wc -l` != "0" ];then
  97. echo "$DATA_TIME: Start $NAME successful!" | tee -a $LOG_PATH
  98. break
  99. else
  100. echo "${DATA_TIME}: [WARNING!] Start $NAME failed[$ii]! ($SYS_MON)" | tee -a $LOG_PATH
  101. /etc/init.d/$NAME start
  102. sleep 5
  103. fi
  104. done
  105. if [ `pgrep $NAME | wc -l` != "0" ];then
  106. echo "${DATA_TIME}: [ERROR!] Start $NAME failed! ($SYS_MON)" | mail -s "Start $NAME failed" $EMAIL
  107. fi
  108. fi
  109. done
  110.  
  111. STATUS_CODE=`curl -o /dev/null -s -w %{http_code} $MY_URL`
  112. #echo -e "STATUS CODE: $STATUS_CODE\n"
  113.  
  114. if [ "$STATUS_CODE" != "200" ];then
  115. sleep 3
  116. STATUS_CODE=`curl -o /dev/null -s -w %{http_code} $MY_URL`
  117. if [ "$STATUS_CODE" != "200" ];then
  118. echo "${DATA_TIME}: [WARNING!] Website Downtime! ($SYS_MON)" | tee -a $LOG_PATH
  119. echo "${DATA_TIME}: [WARNING!] Website Downtime! ($SYS_MON)" | mail -s "Start $NAME failed" $EMAIL
  120. fi
  121. fi
Advertisement
Add Comment
Please, Sign In to add comment