Mick Sear - 2005-07-07 07:37:58 -
In reply to message 1 from Kaurov Eugene
OK, so perhaps I should have added an example before I posted the class... :)
I wrote this to solve this problem: How to log cron events and then check if they ran when they should. So, one script runs on server A, and logs the fact in a DB. Server B's script knows what the schedule is (something like 0 5 * * *) and needs to know how to determine if the job on server A ran when it was supposed to. So, the script has something like this which logs and checks:
$project = 1;
@include "slave.php";
@db_log($project, "CRON", "$_ENV[HOSTNAME] starting test cron job");
Slave.php, apart from some includes, has the following code:
if (isset($project)){
if (didCronRun($project, "A") && $_ENV[HOSTNAME] == "B"){
$debug_msg .= "$project cron ran on $_ENV[HOSTNAME] !!!\n";
exit;
} else {
$debug_msg .= "Hostname is set to ".$_ENV[HOSTNAME];
}
}
and the hostname is set an an environment variable in the crontab.
Finally, actually using the class: the function 'didCronRun()' is defined as follows:
/**
* Utility function to determine if the cron job (id) ran normally for a
* given host.
*/
function didCronRun($id, $host){
//Get the cron schedule for this project.
global $debug_msg;
$db = new mcs_db();
$q = "select cron_schedule from projects where id='".$id."'";
$cron_schedule = mysql_result(mysql_query($q, $db->conn),0,0);
$debug_msg .= "Cron schedule: ".$cron_schedule."\n";
//Start new cron parser instance
$cron = new CronParser($cron_schedule);
$lastRan = $cron->getLastRan();
$nice_time = "Last ran: ".$lastRan[5]."/".$lastRan[3]."/".$lastRan[2]." ".$lastRan[1].":".$lastRan[0];
$debug_msg .= "Last ran: ".$nice_time."\n";
//Convert to Unix timestamp
$cron_ran = mktime ( $lastRan[1] ,$lastRan[0],0 , $lastRan[3] ,$lastRan[2], $lastRan[5]);
//$window = mktime ($lastRan[1] ,$lastRan[0],0 , $lastRan[3] ,$lastRan[2], $lastRan[4]);
$debug_msg .= "Cron ran ".date("l dS of F Y h:i:s A", $cron_ran)."\n";
$debug_msg .= "Window ".date("l dS of F Y h:i:s A", $cron_ran-45)."\n";
//Now, we look for a log entry for this app's cron job running OK
//We're looking for a time within 45 secs or so of the $cron_ran time...
$q = "SELECT * FROM `monitor` WHERE event_date > from_unixtime(".($cron_ran-45).") " .
" and event_type = 'CRON' " .
" and project_id='".$id."' " .
" order by event_date desc ";
$debug_msg .= $q."\n";
$r = @mysql_query($q, $db->conn);
$row = @mysql_fetch_array($r);
//Return either true or false depending on whether the job has run OK since given time.
if (isset($row['hostname']) && $row['hostname'] == $host){
return true ;
} else {
return false;
}
}
I'll add some proper documentation and an example application at some stage soon. Hopefully this helps you for now.
Cheers,
Mick