check_load.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #!/usr/bin/env bash
  2. # Author: Jon Schipp
  3. ########
  4. # Examples:
  5. # 1.) Check system load with autodetect OS and CPU's to determine thresholds
  6. # $ ./check_load.sh -a
  7. # Nagios Exit Codes
  8. OK=0
  9. WARNING=1
  10. CRITICAL=2
  11. UNKNOWN=3
  12. usage()
  13. {
  14. cat <<EOF
  15. Check system load for Linux, FreeBSD, OSX, and AIX.
  16. Options:
  17. -a Autodetect OS and CPUs
  18. -c <int> Critical threshold
  19. -o <os> OS type, "linux/osx/freebsd/aix"
  20. -p <int> Specify number of CPUs
  21. -w <int> Warning threshold
  22. Usage:$0 -a
  23. EOF
  24. }
  25. argcheck() {
  26. # if less than n argument
  27. if [ $ARGC -lt $1 ]; then
  28. echo "Missing arguments! Use \`\`-h'' for help."
  29. exit 1
  30. fi
  31. }
  32. determine_cpus() {
  33. if [[ $OS == linux ]]; then
  34. CORES=$(nproc)
  35. fi
  36. if [[ $OS == freebsd ]]; then
  37. CORES=$(sysctl -n hw.ncpu)
  38. fi
  39. if [[ $OS == osx ]]; then
  40. CORES=$(sysctl -n hw.ncpu)
  41. fi
  42. if [[ $OS == aix ]]; then
  43. CORES=$(lparstat -i | awk -F : '/Active Physical CPUs/ { print $2 }')
  44. fi
  45. }
  46. determine_command () {
  47. if [[ "$OS" == osx ]]; then
  48. UPTIME=$(uptime | awk -F : '{ print $4 }')
  49. elif [[ "$OS" == linux ]]; then
  50. UPTIME=$(uptime |sed 's/.*: //' | sed 's/,//g')
  51. elif [[ "$OS" == freebsd ]]; then
  52. UPTIME=$(uptime | awk -F : '{ print $4 }' | sed 's/,//g')
  53. elif [[ "$OS" == aix ]]; then
  54. UPTIME=$(uptime | awk -F : '{ print $4 }' | sed 's/,//g')
  55. else
  56. echo "OS not supported"
  57. exit $UNKNOWN
  58. fi
  59. }
  60. auto_os_detect() {
  61. UNAME=$(uname)
  62. if [[ "$UNAME" == Linux ]]; then
  63. OS="linux"
  64. elif [[ "$UNAME" == Darwin ]]; then
  65. OS="osx"
  66. elif [[ "$UNAME" == Freebsd ]]; then
  67. OS="freebsd"
  68. elif [[ "$UNAME" == AIX ]]; then
  69. OS="aix"
  70. else
  71. echo "Unsupported OS type!"
  72. exit 1
  73. fi
  74. }
  75. ARGC=$#
  76. CRIT=0
  77. WARN=0
  78. THRESHOLD=0
  79. LOAD=0
  80. AUTO_DETECT=0
  81. CORES=0
  82. OS=null
  83. CRIT_STATUS=0
  84. WARN_STATUS=0
  85. OK_STATUS=0
  86. argcheck 1
  87. while getopts "hac:o:p:w:" OPTION
  88. do
  89. case $OPTION in
  90. h)
  91. usage
  92. exit 0
  93. ;;
  94. a)
  95. AUTO_DETECT=1
  96. auto_os_detect
  97. determine_cpus
  98. ;;
  99. c)
  100. CRIT="$OPTARG"
  101. THRESHOLD=1
  102. ;;
  103. o)
  104. echo "Need to implement \`\`-o'' yet"
  105. exit 1
  106. ;;
  107. p)
  108. CORES="$OPTARG"
  109. ;;
  110. w)
  111. WARN="$OPTARG"
  112. THRESHOLD=1
  113. ;;
  114. \?)
  115. exit 1
  116. ;;
  117. esac
  118. done
  119. determine_command
  120. if [ $THRESHOLD -eq 0 ]; then
  121. for load in $UPTIME
  122. do
  123. LOAD=$(/usr/bin/printf "%d\n" $load 2>/dev/null)
  124. if [ $LOAD -gt $CORES ]; then
  125. CRIT_STATUS=$((CRIT_STATUS+1))
  126. elif [ $LOAD -gt $CORES ]; then
  127. WARN_STATUS=$((WARN_STATUS+1))
  128. else
  129. OK_STATUS=$((OK_STATUS+1))
  130. fi
  131. done
  132. fi
  133. if [ $THRESHOLD -eq 1 ]; then
  134. for load in $UPTIME
  135. do
  136. LOAD=$(/usr/bin/printf "%d\n" $load 2>/dev/null)
  137. if [ $LOAD -gt $CRIT ]; then
  138. CRIT_STATUS=$((CRIT_STATUS+1))
  139. elif [ $LOAD -gt $WARN ]; then
  140. WARN_STATUS=$((WARN_STATUS+1))
  141. else
  142. OK_STATUS=$((OK_STATUS+1))
  143. fi
  144. done
  145. fi
  146. if [ $CRIT_STATUS -gt 0 ]; then
  147. echo "Load average critical: $UPTIME"
  148. exit $CRITICAL
  149. elif [ $WARN_STATUS -gt 0 ]; then
  150. echo "Load average warning: $UPTIME"
  151. exit $WARNING
  152. else
  153. echo "Load average: $UPTIME"
  154. exit $OK
  155. fi