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"]);
}
}
}
?>