#!/bin/bash # # Script to notify admin user if Linux,FreeBSD load crossed certain limit # It will send an email notification to admin. # # Copyright 2005 (c) nixCraft project # This is free script under GNU GPL version 2.0 or above. # Support/FeedBack/comment : http://cyberciti.biz/fb/ # Tested os: # * RedHat Linux # * Debain Linux # * FreeBSD # ------------------------------------------------------------------------- # This script is part of nixCraft shell script collection (NSSC) # Visit http://bash.cyberciti.biz/ for more information. # ------------------------------------------------------------------------- # Set up limit below NOTIFY="6.0" # admin user email id EMAIL="root" # Subject for email SUBJECT="Alert $(hostname) load average" # ----------------------------------------------------------------- # Os Specifc tweaks do not change anything below ;) OS="$(uname)" TRUE="1" if [ "$OS" == "FreeBSD" ]; then TEMPFILE="$(mktemp /tmp/$(basename $0).tmp.XXX)" FTEXT='load averages:' elif [ "$OS" == "Linux" ]; then TEMPFILE="$(mktemp)" FTEXT='load average:' fi # get first 5 min load F5M="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f1) | sed 's/ //g'" # 10 min F10M="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f2) | sed 's/ //g'" # 15 min F15M="$(uptime | awk -F "$FTEXT" '{ print $2 }' | cut -d, -f3) | sed 's/ //g'" # mail message # keep it short coz we may send it to page or as an short message (SMS) echo "Load average Crossed allowed limit $NOTIFY." >> $TEMPFILE echo "Hostname: $(hostname)" >> $TEMPFILE echo "Local Date & Time : $(date)" >> $TEMPFILE # Look if it crossed limit # compare it with last 15 min load average RESULT=$(echo "$F15M > $NOTIFY" | bc) # if so send an email if [ "$RESULT" == "$TRUE" ]; then mail -s "$SUBJECT" "$EMAIL" < $TEMPFILE fi # remove file rm -f $TEMPFILE
Get the latest tutorials on SysAdmin, Linux/Unix, Open Source, and DevOps topics:
- RSS feed or Weekly email newsletter
- Share on Twitter • Facebook • 9 comments... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
For me the script is running but seems it’s failing in sending email.
Will this script be running continuously and throwing mails or throw one mail and stop???
Hi,
Thank you for sharing your knowledge ;-)
Just a little point of detail about this script:
the uptime command returns 3 values : 1mn average, 5mn average and 15mn average, not 5mn,10mn and 15mn as you wrote.
The quotes and double-quotes in the corrected lines originally submitted by Anonymous are not simple straight quotes, but curly “smart quotes” (most likely inserted by some MS Word or Outlook editor not designed for code).
Your script will fail if you simply copy and paste those lines from the web page into your text editor, as curly quotes are not valid delimiters in any shell.
Here is the corrected script as it is working on my FreeBSD system. I hope this will appear here unaltered:
working great
thank you
Linux xxx.com 2.6.18-164.6.1.el5 #1 SMP Tue Nov 3 16:18:27 EST 2009 i686 i686 i386 GNU/Linux
(standard_in) 1: illegal character: |
(standard_in) 1: parse error
(standard_in) 1: illegal character: ‘
(standard_in) 1: illegal character: ‘
error.
Solved.
#F5M=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f1) | sed ‘s/ //g'”
#F10M=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f2) | sed ‘s/ //g'”
#F15M=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f3) | sed ‘s/ //g'”
lines should be
F5M=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f1)”
# 10 min
F10M=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f2)”
# 15 min
F15M=”$(uptime | awk -F “$FTEXT” ‘{ print $2 }’ | cut -d, -f3)”
with
bash –version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
bc confused about comparison results.
The correction in the comment above simply removes the sed command from the end of the pipeline on all three lines:
| sed ‘s/ //g’
As it turns out, the error is also corrected by moving the closing right paren so that it includes the sed command within the main pipeline. For example, change:
to:
(and the same for the F5 and F10 lines, in case you use them)
Doesn’t appear to work?
Even when the value from bc is 0 it still sends a email?