Simpler Navigation for Servers and Operating Systems
Completed: a much simpler Servers and Operating Systems section of the Community. We combined many of the older boards, so you won't have to click through so many levels to get at the information you need. Check the consolidated boards here as many sub-forums are now single boards.
Languages and Scripting
cancel
Showing results for 
Search instead for 
Did you mean: 

help regarding bdf output shell script !!!!

SOLVED
Go to solution
Pravin Salgaonkar
Frequent Advisor

help regarding bdf output shell script !!!!

Hi,
I have written a funtion which taken bdf output and put's in a file.
The idea is to get all areas greater than 80% and echo the same on the system once they have reached 80 % limit. However the script I have written fails with the error.

The script is :-

======================================
output ()
{/usr/bin/bdf -l |awk '$0 !~ /^F/' |awk '{print $5"\t" $6}'| sed 's/'%'/''/' >/tmp/bdflist}

panic ()
{while read percent dir
do
if [[ $percent -ge 80 ]]
then
echo "File syste Full - `hostname`:$dir is at $percent%"
fi
done} < /tmp/bdflist
output
panic
===========================================
+ awk $0 !~ /^F/
+ awk {print $5"\t" $6}
+ sed s/%//
+ 1> /tmp/bdflist}
./test[8]: Syntax error at line 9 : `do' is not expected.

Please assist in resolving the same.
Thanking you in advance
13 REPLIES
Court Campbell
Honored Contributor

Re: help regarding bdf output shell script !!!!

here is a simple script i use written in perl. feel free to change it up.

$mailto = 'some@email_addr.com';
$hostname = `hostname`;
@mounts = `bdf`; #puts bdf info into seperate array elements

foreach (@mounts){
if ($_ =~ /100%|9[0-9]|8[0-9]%/) {
$fs = $';
chop $fs;
$mesg .= "$fs is at $&.\n";
}
}

if ($mesg) {
`echo "$mesg" | mailx -s "$hostname Filesystem Warning" $mailto`;
}
"The difference between me and you? I will read the man page." and "Respect the hat." and "You could just do a search on ITRC, you don't need to start a thread on a topic that's been answered 100 times already." Oh, and "What. no points???"
Hasan Atasoy
Honored Contributor

Re: help regarding bdf output shell script !!!!

output ()
{
/usr/bin/bdf -l |awk '$0 !~ /^F/' |awk '{print $5"\t" $6}'| sed 's/'%'/''/' >/tmp/bdflist
}

panic ()
{
cat /tmp/bdflist | while read percent dir
do
if [[ $percent -ge 80 ]]
then
echo "File syste Full - `hostname`:$dir is at $percent%"
fi
done
}
output
panic
Court Campbell
Honored Contributor
Solution

Re: help regarding bdf output shell script !!!!

noticed a mistake

($_ =~ /100%|9[0-9]|8[0-9]%/)

should be

($_ =~ /100%|9[0-9]%|8[0-9]%/)

"The difference between me and you? I will read the man page." and "Respect the hat." and "You could just do a search on ITRC, you don't need to start a thread on a topic that's been answered 100 times already." Oh, and "What. no points???"
Geoff Wild
Honored Contributor

Re: help regarding bdf output shell script !!!!

Try:

/usr/bin/bdf -l |awk '$0 !~ /^F/' |awk '{print $5"\t" $6}'| sed 's/'%'/''/'|
while read percent dir
do
if [[ $percent -ge 80 ]]
then
echo "File syste Full - `hostname`:$dir is at $percent%"
fi
done


Rgds...Geoff
Proverbs 3:5,6 Trust in the Lord with all your heart and lean not on your own understanding; in all your ways acknowledge him, and he will make all your paths straight.
James R. Ferguson
Acclaimed Contributor

Re: help regarding bdf output shell script !!!!

Hi:

The simple fix, is to place the curly braces for each function on a line by themselves:

...
output ()
{
/usr/bin/bdf -l |awk '$0 !~ /^F/' |awk '{print $5"\t" $6}'| sed 's/'%'/''/' >/tmp/bdflist
}
panic ()
{
while read percent dir
do
if [[ $percent -ge 80 ]]
then
echo "File syste Full - `hostname`:$dir is at $percent%"
fi
done
} < /tmp/bdflist
output
panic

...

This script could/should be rewritten to eliminate using temporary files (pipe output to the 'read') and should let ONE 'awk' do the work of matching and extracting (consider using 'awk's 'split').

For a simple script like this, in-lining your code like Geoff suggested is probably a more-readable approach.

Regards!

...JRF...
john korterman
Honored Contributor

Re: help regarding bdf output shell script !!!!

Hi,

include a shell interpreter and a few newlines:

#!/usr/bin/sh
output ()
{
/usr/bin/bdf -l |awk '$0 !~ /^F/' |awk '{print $5"\t" $6}'| sed 's/'%'/''/' >/tm
p/bdflist
}

panic ()
{
while read percent dir
do
if [[ $percent -ge 80 ]]
then
echo "File syste Full - `hostname`:$dir is at $percent%"
fi
done < /tmp/bdflist
}

output
panic


regards,
John K.
it would be nice if you always got a second chance
spex
Honored Contributor

Re: help regarding bdf output shell script !!!!

The latest version of Bill Hassell's bdfmegs shell script includes a '-P ' option to suppress output for filesystems with utilization <= pct. You can grab it from this thread:

http://forums1.itrc.hp.com/service/forums/questionanswer.do?threadId=1124262

PCS
Bill Hassell
Honored Contributor

Re: help regarding bdf output shell script !!!!

One of the problems with bdf is that it automatically wraps a line if the source disk name is too long and this messes up all the numbers. My bdfmegs script can be run with any headers and show just the problem mountpoints. You can select the maximum percentage:

bdfmegs -qP 90

Only the mountpoints that are greater than or equal to 90% full will be shown.


Bill Hassell, sysadmin
Bill Hassell
Honored Contributor

Re: help regarding bdf output shell script !!!!

Clarification: bdfmegs always shows each mountpoint on a single line making it ideal for scripting. I have attached the script here.


Bill Hassell, sysadmin
Bill Hassell
Honored Contributor

Re: help regarding bdf output shell script !!!!

Sorry, attachments are not working in the forums today, get your copy from:

http://forums1.itrc.hp.com/service/forums/questionanswer.do?threadId=1124262


Bill Hassell, sysadmin
Dave La Mar
Honored Contributor

Re: help regarding bdf output shell script !!!!

I hve used Bill'd bdfmegs quite successfully.
Here is one we have in production on all machines. It runs on Monday and Friday and looks for 80+% full as well as chack one particular vg.

Regards,

-dl
#!/usr/bin/ksh
#############################################################################
# 12/24/01 dlamar Scan % full for lvols #
# If over the threshold email sysadm #
# 08/21/02 dlamar Changed MAIL_LIST #
# 12/18/02 dlamar Added status of job home to daily report. #
# 12/26/02 dlamar Cleaned up the rm of .txt and .rpt. #
# 06/04/2003 dlamar Added logic to ignore cdrom. #
# 10/08/2003 rmark Corrected logic to check jobprod #
# #
#############################################################################
SCRIPT_HOME="/usr/local/bin/systems"
MAIL_LIST="your_email_address@somewhere.com"


if [ -f $SCRIPT_HOME/percent_full.txt ]
then
rm $SCRIPT_HOME/percent_full.txt
fi

if [ -f $SCRIPT_HOME/percent_full.rpt ]
then
rm $SCRIPT_HOME/percent_full.rpt
fi

echo "\t\t$(hostname)\tSYSTEM/JOB\tDISK\tSTATUS\tREPORT\t`date +%m/%d/%y`\n" > $SCRIPT_HOME/percent_full.rpt
bdf |while read diski
do
dper=`echo $diski | awk -F" " '{printf "%d\n", $5}'`
if [ $dper -gt 80 ]
then
dmount="`echo $diski |awk '{printf "%s\n", $6}'`"
if ( test "$dmount" != "/cdrom" )
then
echo "\t\t\t\t$dmount\t\t$dper% \n" >> /$SCRIPT_HOME/percent_full.txt
fi

fi
done
bdf | grep 0_40 | cut -c48-49 | sed '1d' | read job_percent

if [ $job_percent -gt 80 ]
then
bdf | grep 0_40 | cut -c48-66 | sed '1d' | read jobdir
echo "\t\t\t\t/jobprod\t\t$jobdir \n" >> /$SCRIPT_HOME/percent_full.txt

fi

if [ -f $SCRIPT_HOME/percent_full.txt ]
then
cat /$SCRIPT_HOME/percent_full.txt >> /$SCRIPT_HOME/percent_full.rpt
ux2dos $SCRIPT_HOME/percent_full.rpt | uuencode Lvols_Nearing_full.txt | mailx -m -s "JOBPROD Home & Lvols Over 80% Full on $(hostname)" $MAIL_LIST
fi
"I'm not dumb. I just have a command of thoroughly useless information."
spex
Honored Contributor

Re: help regarding bdf output shell script !!!!

Here's a wrapper script I've written around Bill's bdfmegs.sh:


#!/usr/bin/sh

typeset -i MAXPCT=95
typeset -i TIMEOUT=1 # number of days to retain LOCKFILE
BDFMEGS=/root/scripts/util/bdfmegs.sh
TEMPFILE=/tmp/check_filesystem_usage.${$}.tmp
LOCKFILE=/tmp/check_filesystem_usage.lck

# rm LOCKFILE if mtime > ${TIMEOUT}, so that duplicate reports will be generated, on occasion
find ${LOCKFILE} -type f -mtime +${TIMEOUT} -print | xargs rm -f 2> /dev/null
[ ! -f ${LOCKFILE} ] && touch ${LOCKFILE}

trap "[ -f ${TEMPFILE} ] && rm -f ${TEMPFILE}" 0 1 2 3 15
${BDFMEGS} -qglP ${MAXPCT} | grep -v '^$' > ${TEMPFILE}

if [ -s ${TEMPFILE} ]
then
$(grep -q -v -f ${LOCKFILE} ${TEMPFILE}) && \
{ grep -v -f ${LOCKFILE} ${TEMPFILE} >> ${LOCKFILE}
mailx -m -s "WARNING! FILESYSTEM(S) OVER ${MAXPCT}% FULL!" root << EOF
File-System Gbytes Used Avail %Used Mounted on
$(cat ${TEMPFILE})

Remember to delete ${LOCKFILE} after freeing up space!
EOF
}
# exit with rc of 1 if any filesystems with utilization > ${MAXPCT} were returned
exit 1
fi

# otherwise, exit with rc of 0
exit 0
Highlighted
Pravin Salgaonkar
Frequent Advisor

Re: help regarding bdf output shell script !!!!

thanks