Unix space checking script

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted!

  1. The problem statement, all variables and given/known data:
    Im still pretty new to this and could really use some help with this task

"Write a script to check in the directory specified by
the first argument, if there is enough free space specified by the second
argument. Provide a comprehensive examination of the arguments."

  1. Relevant commands, code, scripts, algorithms:

  2. The attempts at a solution (include all code and scripts):

  3. Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
    New Bulgarian University, Sofia, Bulgaria, for professor Simionov course number CSCB731

Thanks to everyone and this forum

Note: Without school/professor/course information, you will be banned if you post here! You must complete the entire template (not just parts of it).

what are you expecting? where are your problems?

usefull commands you might want to use: "df" and "du".

look at the mapages of the commands and see if this gets you any further.

Please mention what Operating System you are running and what Shell you use:

uname -a
echo $SHELL

What have you tried so far ?

The knowledge can only be get by practice

Hint. This command gives the free disc space available in a filesystem containing a particular drectory. It works on most modern unix systems.

df -Pk /directory

Thanks alot for your hints and help.
This is the result I came up with, but my pc died yesterday and I am now only able to access internet club pc's and cannot test the code yet, can someone please give a look and tell me if it's wrong. Thanks alot guys

if [ -d directory ]
then
  du -hs directoryname
else 
  echo Directory not found
fi

You are using du (disk usage). This tells you nothing about the availability of space.

As was previously mentioned the df command will show free space.

If you don't have access to manpages, you can read them here.

man pages link

Thanks alot scottn
so how about this ?

if [ -d directory ]
then
df -hs directoryname
else 
echo Directory not found
fi

-s is not an option to df (there's nothing to summarise).

Your script also expects two arguments (call them $1 and $2), and you need to make sense of the df output to get what you need.

if [ -d "$1" ]; then
  FREE=$(df -k "$1" | <some parsing to get free space field>)
  [ $FREE -le $2 ] && echo Not enough space
else
  echo Directory does not exist

(I don't think using -h is so great. It will change depending on how much space is available (could be in GB, MB, etc.))

bash (search for positional parameters)
df

Things that may help you extract the information you need:
awk
sed

1 Like

I tried re-doing it, please tell me what you think and if you can find mistakes
I do a space check as follows basing my alert on available,

for dspace in `df -k /filesystem |tail -1 |awk '{print $1}'`
do
if [ $dspace -le "80" ]
then 
echo $dspace % available 
else 
df -k /filesystem > /tmp/fsspace 
cat /usr/local/bin/fswarn.txt /tmp/fsspace > /usr/local/bin/fswarning.txt 
/usr/bin/mailx -s "FS exceeded 80% and is at $dspace % FULL needs attention" mymail@mydomain.tld < /usr/local/bin/export
warning.txt
fi

I think you're doing great :slight_smile:

There's a couple of things.

for dspace in `df -k /filesystem |tail -1 |awk '{print $1}'`

Your df here takes the last line (tail -1) and prints the first field (awk '{print $1}'. That should leave you with a single word, so the for-loop isn't really necessary.

And the output of df, which varies from system to system, probably wouldn't show the space free in the first field.

On my system (OS X), for example:

/Users/scott/scripts/tmp $ df -k .                           
Filesystem   1024-blocks      Used Available Capacity  Mounted on
/dev/disk0s2   976426672 838053612 138117060    86%    /

the available space would be in "$4", and the used space as a percentage in "$5".

You're also "catting" a couple of files in the else part of your if statement. Where do they come from?

Assuming that /usr/local/fswarn.txt exists, and that /usr/local/bin/exportwarning.txt should be /usr/local/bin/fswarning.txt (!), you could simplify that a bit.

fsfile=/tmp/fsspace.txt  # set it here, so I don't have to change it in more than one place
df -k $1 > $fsfile
dspace=$(tail -1 $fsfile | awk '{print 100-$5}')  #100% - % used = % available
if [ $dspace -lt $2 ]; then
  echo "$dspace % available"
else
   cat /usr/local/bin/fswarn.txt /tmp/fsspace | /usr/bin/mailx -s "FS exceeded $2% ....."  mymail@mydomain.tld
fi

It still needs work (primarily checking that the arguments are given, and valid, but I'm sure you can handle that :slight_smile:

1 Like

first of all thx a lot scottn :b: your help if really great !!!
Your giving me confidence to continue trying to do this :slight_smile:
So here is attempt number 3 I wrote that when waiting for a previous answer and don't want it to go to waste so here goes :

Assuming parameter '1' is a mount point and parameter '2' is a percent "free", then :

if [ -d "$1" ]; then
  FREE=$(df -k $1 | |awk 'NR==2{print 100-substr($5,1,length($5)-1);}')
  [ $FREE -le $2 ] && echo "Not enough space, ${FREE}% left"
else
  echo "Directory $1 does not exist"
fi 

Getting there!

NR==2 isn't perfect. Some df's can output on three lines.

On Linux, using -P (the so-called "POSIX" option) would show the output on two lines.

i.e.

# ssh root@oraserv1
/ # cd /oracle
# df .
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/ora001vg-ora001lv
                       8252856   4752396   3081236  61% /oracle

/oracle # df -P .
Filesystem         1024-blocks      Used Available Capacity Mounted on
/dev/mapper/ora001vg-ora001lv   8252856   4752396   3081236      61% /oracle

tail is good. sed can also get the last line:

/oracle # df . | sed '$!d'  # from the link, search "print the last line of a file"
                       8252856   4752396   3081236  61% /oracle

And with awk, there's no need to remove the %. It'll do that for you when it know's it's a number.

$ echo 22% | awk '{print 100-$1}'  
78