webcron-s

webcron-s ~
Back File: webcron-s.php Modified: 56964315 seconds ago.
<?php
$jobs = [
	[
		"start"=> "php loop.php",
		"track"=> "loop.php",	
		"await"=> [
			"script"=> "self",
			"max_time"=> 10,
		]
	]
];

function writelog($append, $enabled){
	if($enabled){
		file_put_contents("webcron.log", $append, FILE_APPEND);		
	}
}

function running_task($task, $preg){
	$r = explode("\n", shell_exec("ps ax | grep ".$task));
	for($i = 0; $i < count($r); $i++){
		if(preg_match("/".$preg."/i", $r[$i])){
			$re = explode(" ", $r[$i]);
			$l = 0;
			while($re[$l] === ""){
				$l = $l + 1;
			}
			return intval($re[$l]);		
		}
	}

	return false;
}

function runned($taskstart){
	return time() - $taskstart;
}

function kill($pid, $term){
	shell_exec("kill ".$pid);
	echo "Process: ".$pid.". Was killed for reaching over limit: ".$term."\n";
}

function terminate($term, $time, $pid){
	if(preg_match("/D/i",$term)){
		$s = intval(str_replace(["D", "d"], "", $term));	
		echo ($time / 60 / 60 / 24) . "\t".floatval($s)."\n";
		if($time / 60 / 60 / 24 > $s){
			kill($pid, $term);
		}	
	}elseif(preg_match("/H/i", $term)){
		$s = intval(str_replace(["H", "h"], "", $term));	
		echo ($time / 60 / 60) . "\t".floatval($s)."\n";
		if($time / 60 / 60 > $s){
			kill($pid, $term);
		}
	}elseif(preg_match("/M/i", $term)){
		$s = intval(str_replace(["M", "m"], "", $term));	
		echo ($time / 60) . "\t".floatval($s)."\n";
		if($time / 60 > $s){
			kill($pid, $term);	
		}
	}else{	
		if($term < $time){
			kill($pid, $term);
		}
	}
}


function clear($l, $item){
	$new = [];
	for($i = 0; $i < count($l); $i++){
		if($item !== $l[$i]["idx"]){
			array_push($new, $l[$i]);
		}
	}
	return $new;
}


$cli = $argv;
$running = [];
$cronepoch = time();
$enable_logging = false;

if(isset($_SERVER["REQUEST_URI"])){
	echo "<pre>".file_get_contents("../script/webcron-s.txt")."</pre>";
	exit;
}

if(in_array("-l", $cli, true)){
	$enable_logging = true;
}

if(in_array("-s", $cli, true)){
	$cidx = 0;
	foreach($cli as $p=>$i){
		if($i === "-s"){$cidx = $p;}
	}
	$start = $cli[($cidx+1)];
	$track = $cli[($cidx+2)];

	if(isset($start) && isset($track)){
	
	}
}

if(in_array("-r", $cli, true)){
for($i = 0; $i<count($jobs); $i++){
			
	shell_exec($jobs[$i]["start"]. " > /dev/null 2>&1 &");	
	array_push($running, 
		[
			"idx"=> $i, 
			"pid"=> running_task($jobs[$i]["track"], $jobs[$i]["start"]),
			"time"=> time(),
		]
	);	
	
	$current_task_pid = running_task($jobs[$i]["track"], $jobs[$i]["start"]);	

	if(isset($jobs[$i]["await"])){
		if(isset($jobs[$i]["await"]["script"])){
			switch($jobs[$i]["await"]["script"]){
			case "self":
				if(running_task($jobs[$i]["track"], $jobs[$i]["start"])){
					writelog(
						"Task Started: " . $i . "\tPID: " . $current_task_pid . "\n", 
						$enable_logging
					);	
				}

				while(running_task($jobs[$i]["track"], $jobs[$i]["start"]) !== false){

					writelog(
						"Awaiting Task: " . 
						$i . "\tTime: " . 
						runned($running[$i]["time"]) . "\n", 
						$enable_logging
					);

					terminate(
						$jobs[$i]["await"]["max_time"],
						runned($running[$i]["time"]),
						$running[$i]["pid"]
					);	

					sleep(1);	
				}				
			break;
			}
		}
	}

	
	foreach($running as $task_running){
		if(running_task(
			$jobs[$task_running["idx"]]["track"], 
			$jobs[$task_running["idx"]]["start"])
		){
				
		}else{	
			$running = clear($running, $task_running["idx"]);
		}
	}

}

}

while(count($running) > 0){
	echo "Running Exit Cleanup.\t Waiting for background processes to finish.\n";
	foreach($running as $task_running){
		if(running_task(
			$jobs[$task_running["idx"]]["track"], 
			$jobs[$task_running["idx"]]["start"])
		){
				
		}else{	
			$running = clear($running, $task_running["idx"]);
		}
	}
}
?>