Headless and unmonitored servers sometimes becomes a pain when your server stops responding and later you figure out it was due to 100% disk usage. This simple php script can periodicly check for disk usage and send you email alert when the disk usage is above 90%.
Step 1) You will need php-cli and come other packages too achive this. In ubuntu or debian you can do this by
apt-get update
apt-get install php-mail php-net-smtp php-net-socket php-pear php5-cli
Step 2) Create /usr/local/bin/diskspacecheck.php with the following content using your favourite editor, mine is nano 🙂
#!/usr/bin/php
<?php
require_once “Mail.php”;
/*
* FUNCTION TO SEND MAIL
*/
function SendMail($msg){
$date = date(‘r’);
$bodymsg = $msg;
$hostname = gethostname();
$hostname = preg_replace(“/[^a-zA-Z0-9_ -]/s”,”_”,$hostname);
$from = ”
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
“;
$to = ”
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
“;
$subject = “$bodymsg”;
$body = “This is an automatic alert. Please do not reply.nn$bodymsg – $date”;
$port = “465”;
$host = “ssl://smtp.gmail.com”;
$username = ”
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
“;
$password = “MyPassword”;
/*
* REPLACE
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
ANS MyPassword WITH AN ACTIVE GMAIL ACCOUNT.
*/
$headers = array (‘From’ => $from,
‘To’ => $to,
‘Subject’ => $subject);
$smtp = Mail::factory(‘smtp’,
array (‘host’ => $host,
‘port’ => $port,
‘auth’ => true,
‘username’ => $username,
‘password’ => $password));
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail)) {
echo(“<p>” . $mail->getMessage() . “</p>”);
} else {
echo(“<p>Message successfully sent!</p>”);
}
}
/*
* FUNCTION TO DISPLAY SIZE IN HUMAN READABLE FORMAT
*/
function formatSize( $bytes )
{
$types = array( ‘B’, ‘KB’, ‘MB’, ‘GB’, ‘TB’ );
for( $i = 0; $bytes >= 1024 && $i < ( count( $types ) -1 ); $bytes /= 1024, $i++ );
return( round( $bytes, 2 ) . ” ” . $types[$i] );
}
/*
* CHECK DISKSPACE FOR / PARTITION
*/
$dt = disk_total_space(“/”);
$df = disk_free_space(“/”);
$du = $dt – $df;
$dp = sprintf(‘%.2f’,($du / $dt) * 100);
$df = formatSize($df);
$du = formatSize($du);
$dt = formatSize($dt);
if ($dp > 90){
SendMail(“disk usage of / is $dp%nFree Space – $dfnDisk Usage – $dun”);
}
/*
* CHECK DISKSPACE FOR /home PARTITION
*/
$dt = disk_total_space(“/home”);
$df = disk_free_space(“/home”);
$du = $dt – $df;
$dp = sprintf(‘%.2f’,($du / $dt) * 100);
$df = formatSize($df);
$du = formatSize($du);
$dt = formatSize($dt);
/*
* THIS WILL SEND AN EMAIL ALERT WHEN DISKUSAGE IS ABOVE 90%, YOU CAN CHANGE THIS VALUE THAT SUITES YOUR REQUIREMENT
*/
if ($dp > 90){
SendMail(“disk usage of /home is $dp%nFree Space – $dfnDisk Usage – $dun”);
}
?>
Step 3) Create a cron job which will run this script daily and alert when the disk space goes low
nano /etc/cron.d/diskspacecheck30 10 * * * root /usr/bin/php -f /usr/local/bin/diskspacecheck.php
This cronjob will run this php script every day 10:30am. Change it to suit your need.
Swapnil Jain |
This e-mail address is being protected from spambots. You need JavaScript enabled to view it