Shell Script To Monitor Services Such As Web / Http, Ssh, Mail Server

by admin on July 24, 2009 · 0 comments

#!/bin/bash
# Shell script to monitor running services such as web/http, ssh, mail etc.
# If service fails it will send an Email to ADMIN user
# -------------------------------------------------------------------------
# Copyright (c) 2006 nixCraft project <http://www.cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# See URL for more info
# http://www.cyberciti.biz/tips/processing-the-delimited-files-using-cut-and-awk.html
# ---------------------------------------------------
# Last updated: Jun - 15 - 2009.
ports="22 53 80 25"
 
# service names as per above ports
service="SSH DNS WEB MAIL"
 
#Email id to send alert
ADMINEMAIL="admin@myispname.com"
 
#Bin paths, set them according to your Linux distro
NETSTAT=/bin/netstat
MAIL=/usr/bin/mail
LOGGER=/usr/bin/logger
ID=/usr/bin/id
 
# Red hat usr uncomment
MAIL=/bin/mail
LOGGER=/bin/logger
 
#Counters, set defaults
c=1
status=""
sendmail=0
 
# set the following to 1, if you want message in /var/log/messages via a SYSLOG
logtosyslog=0
 
# Log file used to send an email
LOG="/tmp/services.log.$$"
 
# log message to screen and a log file
log(){
	echo "$@"
	echo "$@" >> $LOG
}
 
# log message and stop script
die(){
	echo "$@"
	exit 999
}
 
# Make sure only root can run it
is_root(){
	local id=$($ID -u)
	[ $id -ne 0 ]  && die "You must be root to run $0."
}
# Look out for all bins and create a log file
init_script(){
	[ ! -x $MAIL ] && die "$MAIL command not found."
	[ ! -x $NETSTAT ] && die "$NETSTAT command not found."
	[ ! -x $LOGGER ] && die "$LOGGER command not found."
	[ ! -x $ID ] && die "$ID command not found."
	is_root
	>$LOG
}
 
# check for all running services and shoot an email if service is not running
chk_services(){
	log "-------------------------------------------------------------"
	log "Running services status @ $(hostname) [ $(date) ]"
	log "-------------------------------------------------------------"
 
	# get open ports
	RPORTS=$($NETSTAT -tulpn -A inet | grep -vE '^Active|Proto' | grep 'LISTEN' | awk '{ print $4}' | cut -d: -f2 | sed '/^$/d' | sort  -u)
 
	# okay let us compare them
	for t in $ports
	do
		sname=$(echo $service | cut -d' ' -f$c)
		echo -en " $snamettt : "
		echo -en " $snamettt : " >> $LOG
		for r in $RPORTS
		do
			if [ "$r" == "$t" ]
			then
				status="YES"
				sendmail=1
				break
			fi
		done
		echo -n "$status"
		echo ""
		echo -n "$status" >>$LOG
		echo "" >>$LOG
		# Log to a syslog /var/log/messages?
		# This is useful if you have a dedicated syslog server
		[ $logtosyslog -eq 1  ] && $LOGGER "$sname service running : $status"
 
		# Update counters for next round
		c=$( expr $c + 1 )
		status="NO"
	done
	log "-------------------------------------------------------------"
	log "This is an automatically generated $(uname) service status notification by $0 script."
 
	if [ $sendmail -eq 1 ];
	then
		$MAIL -s "Service Down @ $(hostname)" $ADMINEMAIL < $LOG
	fi
}
 
### main ###
init_script
chk_services
 
### remove a log file ###
[ -f $LOG ] && /bin/rm -f $LOG

Previous post:

Next post: