BUG 9630 "cron.php script can have several instances running..." SOLVED

- cron.php script can have several instances running at the same time
- Problem solved, added validation in cron.php script to avoid run
  several times
* Available from version 2.0.44
This commit is contained in:
Victor Saisa Lopez
2012-08-30 15:05:39 -04:00
parent 53bac5cef7
commit dfb10bc7aa
2 changed files with 65 additions and 66 deletions

View File

@@ -52,51 +52,56 @@ define ('MEMCACHED_ENABLED', $config['memcached']);
define ('MEMCACHED_SERVER', $config['memcached_server']); define ('MEMCACHED_SERVER', $config['memcached_server']);
define ('TIME_ZONE', $config['time_zone']); define ('TIME_ZONE', $config['time_zone']);
//default values //Default values
$bCronIsRunning = false; $bCronIsRunning = false;
$sLastExecution = ''; $sLastExecution = null;
if ( file_exists(PATH_DATA . 'cron') ) {
$aAux = unserialize( trim( @file_get_contents(PATH_DATA . 'cron')) ); if (file_exists(PATH_DATA . "cron")) {
$bCronIsRunning = (boolean)$aAux['bCronIsRunning']; $arrayAux = unserialize(trim(@file_get_contents(PATH_DATA . "cron")));
$sLastExecution = $aAux['sLastExecution']; $bCronIsRunning = (boolean)($arrayAux["bCronIsRunning"]);
} $sLastExecution = $arrayAux["sLastExecution"];
else {
//if not exists the file, just create a new one with current date
@file_put_contents(PATH_DATA . 'cron', serialize(array('bCronIsRunning' => '1', 'sLastExecution' => date('Y-m-d H:i:s'))));
} }
$WS = ''; if (!$bCronIsRunning) {
$argsx = ''; //Start cron
$sDate = ''; $arrayAux = array("bCronIsRunning" => "1", "sLastExecution" => date("Y-m-d H:i:s"));
@file_put_contents(PATH_DATA . "cron", serialize($arrayAux));
//Data
$ws = null;
$argsx = null;
$sDate = null;
$dateSystem = date("Y-m-d H:i:s"); $dateSystem = date("Y-m-d H:i:s");
for ($i = 1; $i <= count($argv) - 1; $i++) { for ($i = 1; $i <= count($argv) - 1; $i++) {
if( strpos($argv[$i], '+d') !== false){ if (strpos($argv[$i], "+d") !== false) {
$sDate = substr($argv[$i],2); $sDate = substr($argv[$i],2);
} else if( strpos($argv[$i], '+w') !== false){
$WS = substr($argv[$i],2);
} else { } else {
$argsx .= ' '.$argv[$i]; if (strpos($argv[$i], "+w") !== false) {
$ws = substr($argv[$i], 2);
} else {
$argsx = $argsx . " " . $argv[$i];
}
} }
} }
//if $sDate is not set, so take the system time //If $sDate is not set, so take the system time
if ($sDate != "") { if ($sDate != null) {
eprintln("[Applying date filter: $sDate]"); eprintln("[Applying date filter: $sDate]");
} else { } else {
$sDate = $dateSystem; $sDate = $dateSystem;
} }
if ($ws == null) {
if( $WS=='' ){
$oDirectory = dir(PATH_DB); $oDirectory = dir(PATH_DB);
$cws = 0; $cws = 0;
while($sObject = $oDirectory->read()) {
if (($sObject != '.') && ($sObject != '..')) {
if (is_dir(PATH_DB . $sObject)) {
if (file_exists(PATH_DB . $sObject . PATH_SEP . 'db.php')) { while($sObject = $oDirectory->read()) {
$cws++; if (($sObject != ".") && ($sObject != "..")) {
if (is_dir(PATH_DB . $sObject)) {
if (file_exists(PATH_DB . $sObject . PATH_SEP . "db.php")) {
$cws = $cws + 1;
system("php -f \"".dirname(__FILE__).PATH_SEP."cron_single.php\" $sObject \"$sDate\" \"$dateSystem\" $argsx", $retval); system("php -f \"".dirname(__FILE__).PATH_SEP."cron_single.php\" $sObject \"$sDate\" \"$dateSystem\" $argsx", $retval);
} }
} }
@@ -104,7 +109,16 @@ if( $WS=='' ){
} }
} else { } else {
$cws = 1; $cws = 1;
system("php -f \"".dirname(__FILE__).PATH_SEP."cron_single.php\" $WS \"$sDate\" \"$dateSystem\" $argsx", $retval);
} system("php -f \"".dirname(__FILE__).PATH_SEP."cron_single.php\" $ws \"$sDate\" \"$dateSystem\" $argsx", $retval);
eprintln("Finished $cws workspaces processed."); }
//End cron
$arrayAux = array("bCronIsRunning" => "0", "sLastExecution" => date("Y-m-d H:i:s"));
@file_put_contents(PATH_DATA . "cron", serialize($arrayAux));
eprintln("Finished $cws workspaces processed.");
} else {
eprintln("The cron is running, please wait for it to finish.\n- Started in $sLastExecution");
}

View File

@@ -97,21 +97,6 @@ require_once ("classes/model/AppEvent.php");
require_once ("classes/model/CaseScheduler.php"); require_once ("classes/model/CaseScheduler.php");
//G::loadClass("pmScript"); //G::loadClass("pmScript");
//default values
$bCronIsRunning = false;
$sLastExecution = '';
if (file_exists(PATH_DATA . 'cron')) {
$arrayAux = unserialize(trim(@file_get_contents(PATH_DATA . 'cron')));
$bCronIsRunning = (boolean)($arrayAux['bCronIsRunning']);
$sLastExecution = $arrayAux['sLastExecution'];
} else {
//if not exists the file, just create a new one with current date
$arrayAux = array('bCronIsRunning' => '1', 'sLastExecution' => date('Y-m-d H:i:s'));
@file_put_contents(PATH_DATA . 'cron', serialize($arrayAux));
}
if (!defined('SYS_SYS')) { if (!defined('SYS_SYS')) {
$sObject = $argv[1]; $sObject = $argv[1];
$sNow = $argv[2]; $sNow = $argv[2];
@@ -221,9 +206,9 @@ if (!defined('SYS_SYS')) {
processWorkspace(); processWorkspace();
} }
//finally update the file
$arrayAux = array('bCronIsRunning' => '0', 'sLastExecution' => date('Y-m-d H:i:s'));
@file_put_contents(PATH_DATA . 'cron', serialize($arrayAux));
function processWorkspace() function processWorkspace()
{ {