check_service.sh 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. #!/usr/bin/env bash
  2. # Author: Jon Schipp
  3. ########
  4. # Examples:
  5. # 1.) List services for osx
  6. # $ ./check_service.sh -l -o osx
  7. #
  8. # 2.) Check status of SSH service on a linux machine
  9. # $ ./check_service.sh -o linux -s sshd
  10. # 3.) Manually select service management tool and service
  11. # $ ./check_service.sh -o linux -t "service rsyslog status"
  12. # Nagios Exit Codes
  13. OK=0
  14. WARNING=1
  15. CRITICAL=2
  16. UNKNOWN=3
  17. usage()
  18. {
  19. cat <<EOF
  20. Check status of system services for Linux, FreeBSD, OSX, and AIX.
  21. Options:
  22. -s <service> Specify service name
  23. -l List services
  24. -o <os> OS type, "linux/osx/freebsd/aix"
  25. -u <user> User if you need to ``sudo -u'' for launchctl (def: nagios, osx only)
  26. -t <tool> Manually specify service management tool (def: autodetect) with status and service
  27. e.g. ``-t "service nagios status"''
  28. EOF
  29. }
  30. argcheck() {
  31. # if less than n argument
  32. if [ $ARGC -lt $1 ]; then
  33. echo "Missing arguments! Use \`\`-h'' for help."
  34. exit 1
  35. fi
  36. }
  37. os_check() {
  38. if [ "$OS" == null ]; then
  39. echo "Use \`\`-o'' and specify the OS as an argument"
  40. exit 3
  41. fi
  42. }
  43. determine_service_tool() {
  44. if [[ $OS == linux ]]; then
  45. if command -v systemctl >/dev/null 2>&1; then
  46. SERVICETOOL="systemctl status $SERVICE"
  47. LISTTOOL="systemctl"
  48. elif command -v initctl >/dev/null 2>&1; then
  49. SERVICETOOL="status $SERVICE"
  50. LISTTOOL="initctl list"
  51. elif command -v service >/dev/null 2>&1; then
  52. SERVICETOOL="service $SERVICE status"
  53. LISTTOOL="service --status-all"
  54. elif command -v chkconfig >/dev/null 2>&1; then
  55. SERVICETOOL=chkconfig
  56. LISTTOOL="chkconfig --list"
  57. elif [ -f /etc/init.d/$SERVICE ] || [ -d /etc/init.d ]; then
  58. SERVICETOOL="/etc/init.d/$SERVICE status | tail -1"
  59. LISTTOOL="ls -1 /etc/init.d/"
  60. else
  61. echo "Unable to determine the system's service tool!"
  62. exit 1
  63. fi
  64. fi
  65. if [[ $OS == freebsd ]]; then
  66. if command -v service >/dev/null 2>&1; then
  67. SERVICETOOL="service $SERVICE status"
  68. LISTTOOL="service -l"
  69. elif [ -f /etc/rc.d/$SERVICE ] || [ -d /etc/rc.d ]; then
  70. SERVICETOOL="/etc/rc.d/$SERVICE status"
  71. LISTTOOL="ls -1 /etc/rc.d/"
  72. else
  73. echo "Unable to determine the system's service tool!"
  74. exit 1
  75. fi
  76. fi
  77. if [[ $OS == osx ]]; then
  78. if command -v serveradmin >/dev/null 2>&1 && serveradmin list | grep "$SERVICE" 2>&1 >/dev/null; then
  79. SERVICETOOL="serveradmin status $SERVICE"
  80. LISTTOOL="serveradmin list"
  81. elif command -v launchctl >/dev/null 2>&1; then
  82. SERVICETOOL="launchctl list | grep -v ^- | grep $SERVICE || echo $SERVICE not running! "
  83. LISTTOOL="launchctl list"
  84. if [ $(id -u) -eq 0 ]; then
  85. SERVICETOOL="sudo -u $USER launchctl list | grep -v ^- | grep $SERVICE || echo $SERVICE not running! "
  86. LISTTOOL="sudo -u $USER launchctl list"
  87. fi
  88. elif command -v service >/dev/null 2>&1; then
  89. SERVICETOOL="service --test-if-configured-on $SERVICE"
  90. LISTTOOL="service list"
  91. else
  92. echo "Unable to determine the system's service tool!"
  93. exit 1
  94. fi
  95. fi
  96. if [[ $OS == aix ]]; then
  97. if command -v lssrc >/dev/null 2>&1; then
  98. SERVICETOOL="lssrc -s $SERVICE | grep -v Subsystem"
  99. LISTTOOL="lssrc -a"
  100. else
  101. echo "Unable to determine the system's service tool!"
  102. exit 1
  103. fi
  104. fi
  105. }
  106. auto_os_detect() {
  107. echo test
  108. }
  109. ARGC=$#
  110. LIST=0
  111. MANUAL=0
  112. OS=null
  113. SERVICETOOL=null
  114. LISTTOOL=null
  115. SERVICE=".*"
  116. USER=nagios
  117. argcheck 1
  118. while getopts "hls:o:t:u:" OPTION
  119. do
  120. case $OPTION in
  121. h)
  122. usage
  123. exit 0
  124. ;;
  125. l)
  126. LIST=1
  127. ;;
  128. s)
  129. SERVICE="$OPTARG"
  130. ;;
  131. o)
  132. if [[ "$OPTARG" == linux ]]; then
  133. OS="$OPTARG"
  134. elif [[ "$OPTARG" == osx ]]; then
  135. OS="$OPTARG"
  136. elif [[ "$OPTARG" == freebsd ]]; then
  137. OS="$OPTARG"
  138. elif [[ "$OPTARG" == aix ]]; then
  139. OS="$OPTARG"
  140. else
  141. echo "Unknown type!"
  142. exit 1
  143. fi
  144. ;;
  145. t)
  146. MANUAL=1
  147. MANUALSERVICETOOL="$OPTARG"
  148. ;;
  149. u)
  150. USER="$OPTARG"
  151. ;;
  152. \?)
  153. exit 1
  154. ;;
  155. esac
  156. done
  157. os_check
  158. determine_service_tool
  159. if [ $LIST -eq 1 ]; then
  160. if [[ $LISTTOOL != null ]]; then
  161. $LISTTOOL
  162. exit 0
  163. else
  164. echo "OS not specified! Use \`\`-o''"
  165. exit 2
  166. fi
  167. fi
  168. if [ $MANUAL -eq 1 ]; then
  169. SERVICETOOL=$MANUALSERVICETOOL
  170. fi
  171. # Check the status of a service
  172. STATUS_MSG=$(eval "$SERVICETOOL" 2>&1)
  173. case $STATUS_MSG in
  174. *stop*)
  175. echo "$STATUS_MSG"
  176. exit $CRITICAL
  177. ;;
  178. *STOPPED*)
  179. echo "$STATUS_MSG"
  180. exit $CRITICAL
  181. ;;
  182. *not*running*)
  183. echo "$STATUS_MSG"
  184. exit $CRITICAL
  185. ;;
  186. *running*)
  187. echo "$STATUS_MSG"
  188. exit $OK
  189. ;;
  190. *RUNNING*)
  191. echo "$STATUS_MSG"
  192. exit $OK
  193. ;;
  194. *SUCCESS*)
  195. echo "$STATUS_MSG"
  196. exit $OK
  197. ;;
  198. *[eE]rr*)
  199. echo "Error in command: $STATUS_MSG"
  200. exit $CRITICAL
  201. ;;
  202. *[eE]nable*)
  203. echo "$STATUS_MSG"
  204. exit $OK
  205. ;;
  206. *[dD]isable*)
  207. echo "$STATUS_MSG"
  208. exit $CRITICAL
  209. ;;
  210. *[cC]annot*)
  211. echo "$STATUS_MSG"
  212. exit $CRITICAL
  213. ;;
  214. *inactive*)
  215. echo "$STATUS_MSG"
  216. exit $CRITICAL
  217. ;;
  218. *dead*)
  219. echo "$STATUS_MSG"
  220. exit $CRITICAL
  221. ;;
  222. *[aA]ctive*)
  223. echo "$STATUS_MSG"
  224. exit $OK
  225. ;;
  226. *Subsystem*not*on*file)
  227. echo "$STATUS_MSG"
  228. exit $CRITICAL
  229. ;;
  230. [1-9][1-9]*)
  231. echo "$SERVICE running: $STATUS_MSG"
  232. exit $OK
  233. ;;
  234. "")
  235. echo "$SERVICE is not running: no output from service command"
  236. exit $CRITICAL
  237. ;;
  238. *)
  239. echo "Unknown status: $STATUS_MSG"
  240. echo "Is there a typo in the command or service configuration?: $STATUS_MSG"
  241. exit $UNKNOWN
  242. ;;
  243. esac