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

Posted on in Categories Monitoring last updated July 14, 2009

33 comment

  1. Had problem with httpd not using a set ip and with the command in script above does not find services that don’t have them attached to an ip. So I have fixed this with the following command.

  2. RPORTS=$($NETSTAT -tulpn | grep -vE ‘^Active|Proto’ | grep ‘LISTEN’ | awk ‘{ print $4}’ | sed ‘s/[0-9a-z\.\:]*\:\([0-9]\+\)$/\1/’ | sort -u)

  3. Hi,
    You have a couple of bugs.
    1. The script sends whenever at least one process is UP, you want the opposite.
    2 You need to set status to ‘NO’ at the beginning of the loop rather than the end, otherwise if the first service is down it will have a status of empty string.
    3. I would recommend using variables more descriptive than a single character, it will make it easier to read.

    Here are the changes you need to make (note that I renamed the c variable to ‘count’):

    # okay let us compare them
    for t in $ports
    do
    status=”NO”
    sname=$(echo $service | cut -d’ ‘ -f$count)
    echo -en ” $sname\t\t\t : ”
    echo -en ” $sname\t\t\t : ” >> $LOG
    for r in $RPORTS
    do
    if [ “$r” == “$t” ]
    then
    status=”YES”
    break
    fi
    done
    if [ “$status” == “NO” ]
    then
    sendmail=1
    fi
    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
    count=$( expr $count + 1 )
    done

    1. Whoops forgot to use the code blocks


      # okay let us compare them
      for t in $ports
      do
      status="NO"
      sname=$(echo $service | cut -d' ' -f$count)
      echo -en " $sname\t\t\t : "
      echo -en " $sname\t\t\t : " >> $LOG
      for r in $RPORTS
      do
      if [ "$r" == "$t" ]
      then
      status="YES"
      break
      fi
      done
      if [ "$status" == "NO" ]
      then
      sendmail=1
      fi
      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
      count=$( expr $count + 1 )
      done

  4. Hi Smeven,
    Thanks a lot…its worked Fine…:)
    We want ot chane #get open ports section to
    RPORTS=$($NETSTAT -tulapn -A inet,inet6 | grep -vE ‘^Active|Proto’ | grep ‘LISTEN’ | awk ‘{ print $4}’ | cut -d: -f2,4 | cut -d: -f2 | sed ‘/^$/d’ | sort -u) .Then only it will works on Ipv6..

    Regards,
    Shaiju

  5. My experience is that if a port of a running service dosn’t show up in the netstat line, it’s because it’s not using the protocol inet, but inet6 istead.
    try netstat -tulpn -A inet,inet6 , but the some modifications to the cut part of this line has to be done also.
    cut -d: -f2 would fail because of the format of inet6 is different , try cut -d: -f2,4 | cut -d: -f2 instead.

  6. It’s emailing me even when all services are up:

    $ sudo ./monitor.sh
    ————————————————————-
    Running services status @ sabresboard [ Fri Apr 9 18:50:43 EDT 2010 ]
    ————————————————————-
    SSH : YES
    WEB : YES
    MAIL : YES
    ————————————————————-
    This is an automatically generated Linux service status notification by ./monitor.sh script

    Still sends me an email.

  7. Hi thanks for the script..
    How to monitor a new port using the scrip.i want to monitor 8080,and i changed port in the ports=”22 53 80 8080″
    when running the script it is showing that
    SSH : YES
    DNS : YES
    WEB : YES
    tomcat : NO
    please help me
    Regards
    Shaiju

  8. Note that due to the SLQ Injection protection in this forum, the opening apostrophes were replaced with back-quotes. What you see on the screen is correct, but you can’t copy and paste it into your script.

  9. Try with

    Regards,
    Jonas

  10. Hi,

    This script sendmail at services is UP, and not if one of services is DOWN! :D

    I remove the send mail lines and create a external check for a NO ocurrence, and if exists send mail for the administrators and restart services :D

    Regards,

    Fernando

  11. I got the same problem and I’m on FreeBSD. I modified the netstat command part, changed to this.

    RPORTS=$($NETSTAT -ant -A inet | grep ‘LISTEN’ | awk ‘{ print $5}’ | cut -d’.’ -f2 | sed ‘/^$/d’ | sort -u)

    But I still got problem, because of different way those services were initiated. My DNS configured to listen on specific address. So, DNS entry in netstat will be
    XXX.XXX.XXX.XXX.53
    but some other service like smtp will have
    *.25

    I still prefer a script that can monitor the port itself, checking whether its open or not.

  12. There is an error in the “init_script”-section:
    [ ! -x $NETSTAT ] && die “$MAIL command not found.”
    should be like this
    [ ! -x $NETSTAT ] && die “$NETSTAT command not found.”

    1. I’ve tweaked it further. Can you test it again?

      ./svrmon.sh
      Outputs:

      Stop named:
      # service named stop
      Run it again:

  13. -bash-3.00# chmod +x /srv/chkserv
    -bash-3.00# /srv/chkserv
    ————————————————————-
    Running services status @ server.*****.com [ Fri Jun 19 13:53:11 EEST 2009 ]
    ————————————————————-
    SSH :
    WEB : YES
    MAIL : YES
    ————————————————————-
    This is an automatically generated Linux service status notification by /srv/chkserv script.
    -bash-3.00# bash /srv/chkserv
    ————————————————————-
    Running services status @ server.*****.com [ Fri Jun 19 13:53:23 EEST 2009 ]
    ————————————————————-
    SSH :
    WEB : YES
    MAIL : YES
    ————————————————————-
    This is an automatically generated Linux service status notification by /srv/chkserv script.
    -bash-3.00# netstat -tulpn |grep ssh
    tcp 0 0 :::22 :::* LISTEN 9262/sshd
    -bash-3.00# grep port /srv/chkserv
    ports=”22 80 25″

    Any idea?

    1. So now, I replace Ports in script to:
      ports=”80 25 22″
      And Services to:
      service=”WEB MAIL SSH”
      And re-run script:
      -bash-3.00# /srv/chkserv
      ————————————————————-
      Running services status @ server.*****.com [ Fri Jun 19 14:27:53 EEST 2009 ]
      ————————————————————-
      WEB : YES
      MAIL : YES
      SSH : NO
      ————————————————————-
      This is an automatically generated Linux service status notification by /srv/chkserv script.

      I don’t know why :(

      1. Ok, I will look at the script this week end and see if there is any bug that is shooting an email even if service is running.

  14. Hey,
    Thanks, now it work, but I have issue with only ssh. I run sshd service on non-standart port, and replace 22 port with my settings. After thant when I run this script I got blank value.
    ————————————————————-
    Running services status @ server.****.com [ Thu Jun 18 19:07:24 EEST 2009 ]
    ————————————————————-
    SSH :
    WEB : YES
    MAIL : YES
    ————————————————————-
    This is an automatically generated Linux service status notification by checkstatus script.
    And got fake alert :( Can you help me?

    1. Replace port 22 with your actual port such as #3922 in $ports i.e. from

      To:

        1. -bash-3.00# sh /srv/chkserv
          ————————————————————-
          Running services status @ server.*****.com [ Fri Jun 19 12:08:57 EEST 2009 ]
          ————————————————————-
          SSH :
          WEB : YES
          MAIL : YES
          ————————————————————-
          This is an automatically generated Linux service status notification by /srv/chkserv script.
          -bash-3.00# grep Port /etc/ssh/sshd_config
          Port 22
          #GatewayPorts no
          -bash-3.00# ps aux|grep ssh
          root 16151 0.0 0.0 7004 2284 ? Ss 12:07 0:00 sshd: [email protected]
          root 23653 0.0 0.0 4624 632 ttyp0 S+ 12:09 0:00 grep ssh
          root 28047 0.0 0.0 4140 1044 ? Ss Jun18 0:00 /usr/sbin/sshd

          1. Correct way to run script is either:
            chmod +x /srv/chkserv
            /srv/chkserv

            OR
            bash /srv/chkserv
            To find current sshd port enter:
            netstat -tulpn

  15. Hey, this script not workin under CentOS 4.7, script messaged all service is down:
    -bash-3.00# sh test_script.sh
    Running services status:
    SSH: No
    WEB: No
    MAIL: No
    -bash-3.00#
    But all services works fine, can you help me?

Leave a Comment