in reply to dfmon - Disk Free Monitor

This may be a little more flexible for you:

#!/usr/bin/perl -w use strict; use warnings; #usage: diskspace <number between 0 and 100> my $diskuse = $ARGV[0]; my $recipient = "support\@yourdomain.com"; #who gets the report my $dfrep = `df -k`; #get partition report my @partitions = split(/\n/,$dfrep); # split report my (@full, @ele, $usage, $x, $i); my $hostname = `hostname`; chomp($hostname); #check syntax unless ($diskuse > 0 || $diskuse < 100) { print "\nUsage: spaceuse <n>\n"; print "Where n is the maximum percentage of space, in use by "; print "any disk partition\n"; } #check for partitions whose percent full is #greater than or equal to the percent entered #by the user. foreach $i (@partitions) { $_ = $i; if (m/(\d{2})%/) {$usage = $1} if ($diskuse <= $usage) { push(@full,$x) } $x++; } #create and mail report if ($#full != 0) { open(MAIL, "|mail -s \"Diskspace Warning\" $recipient"); print MAIL "\nWarning from $hostname\n"; print MAIL "These Partitions are dangerously full:\n\n"; for (@full) { $_++; $_--; #converts scalar to numberic $partitions[$_] =~ s/\s+/\t/g; @ele = split(/\t/, $partitions[$_]); printf MAIL "%13s %11s %11s %11s %4s %13s\n", $ele[0], $ele[1], $ele +[2], $ele[3], $ele[4], $ele[5]; } close(MAIL); }

Neil Watson
watson-wilson.ca

Replies are listed 'Best First'.
Re: Re: dfmon - Disk Free Monitor
by rob_au (Abbot) on May 14, 2002 at 06:30 UTC
    Thanks for your feedback Neil - A couple of quick comments ...

    • In the reporting loop, the conversion of scalar to numeric can be performed more directly with $_ + 0 instead of the sequential increment and decrement.
    • In a quick test of your code, it didn't appear to correctly validate the parameter passed on the command line - No error messages were returned when using an out of bounds value.
    • In the original snippet of code which I posted, I consciously made use of the Filesys::Df module for the determination of disk space in place of parsing the output of df.

      The reason for this stems from my near paranoid nature about making external system calls - Introducing an external system call places an additional dependency upon the code to run and introduces a point in the system where the code may either fail or be compromised. If you must perform system calls, ensure that the full path to the application is given and that system return codes are checked - Also see my discussion on this here

     

      Thanks for the tips. The code should work. I have it running on several servers now.

      Neil Watson
      watson-wilson.ca