У меня есть следующий тест php для выполнения процесса fork / spawn, где тест также пытается убить дочерний процесс (зомби) после его завершения.
Мне бы хотелось иметь более эффективный процесс, при котором любые дочерние процессы немедленно удаляются из таблицы процессов как можно скорее. Текущая попытка заполняет таблицу процессов и вызывает проблему выделения памяти, которая отключает систему. Приложение работает в системе Fedora / Centos.
Я сталкиваюсь с ошибкой выделения памяти, когда она запускается, и слишком много процессов запускаются, прежде чем они будут удалены.
Любые указатели будут очень благодарны за это спасибо ..
$fname="ef_deptData.txt";
$t=0;
$pids = array();
$pids1[] = array();
$fh=fopen($fname,"r");
$p=0;
while(!feof($fh))
{
print " inside course pppppppppppppppppppppp \n";
//--go ahead and parse the line of input from the file
//--(if it exists)
$buf = fgets($fh);
$buf=trim($buf);
if($buf)
{
$data1=explode("&&",$buf);
$stateVal=trim($data1[0]);
$collegeVal=trim($data1[1]);
$campusVal=trim($data1[2]);
$pid = pcntl_fork();
//process the spawned child procs
if($pid)
{
$pids[$p]=$pid;
$p=$p+1;
}
else
{
$app="ef_course.py";
$args[0]='"'.$stateVal.'"';
$args[1]='"'.$collegeVal.'"';
$args[2]='"'.$campusVal.'"';
pcntl_exec($app, $args);
}
}
$t=$t+1;
if($t==40)
{
sleep(5);
$t=0;
}
}
// --this section is a kludge to see if the child process is complete
// --prior to deleting the spwaned child process (should be a better way)
$q=true;
while($q)
{
$a="ps -aux | grep ef_course | grep -v grep | awk '{print $8}'";
$a=`$a`;
$t=explode("\n",$a);
$t=array_slice($t,1,-1);
print_r($t);
sleep(5);
$y=0;
for($i=0;$i<count($t);$i++)
{
if((strcmp($t[$i],"Z+")!=0)&&(strcmp($t[$i],"Z")!=0))
{
$y=1;
print "ddd \n";
}
}
if($y==0)
{
//--try to go ahead and kill the zombie processes
$w="pgrep ef_course";
$r=`$w`;
if($r!="")
{
//foreach($pids as $p){ posix_kill($p,SIGHUP); }
//foreach($pids as $p){ posix_kill($p,SIGINT); }
foreach($pids as $p){ posix_kill($p,SIGTERM); }
$dead_and_gone = pcntl_waitpid(-1,$status,WNOHANG);
while($dead_and_gone > 0){
// Remove the gone pid from the array
unset($pids[array_search($dead_and_gone,$pids)]);
// Look for another one
$dead_and_gone = pcntl_waitpid(-1,$status,WNOHANG);
}
print_r($pids);
}
else
$q=false;
}
sleep(10);
print "waiting for ef_course.py to complete \n";
}
обновление :::
удалось получить то, что я считаю решением .....
//--start the process to get the store urls..
$fname="ef_programData.txt";
$t=0;
$pids = array();
$pids1[] = array();
$fh=fopen($fname,"r");
$p=0;
while(!feof($fh))
{
print " inside program pppppppppppppppppppppp \n";
//--go ahead and parse the line of input from the file
//--(if it exists)
$tmp=array();
$buf = fgets($fh);
$buf=trim($buf);
if($buf)
{
$data1=explode("&&",$buf);
$pid = pcntl_fork();
//process the spawned child procs
if($pid)
{
$pids[]=$pid;
}
else
{
$args=array();
$app="foo.py";
$args[0]='"'.$stateVal.'"';
pcntl_exec($app, $args);
}
while(pcntl_wait($status, WNOHANG) > 0) {
usleep(500);
}
while(list($key, $val) = each($pids)) {
if(!posix_kill($val, 0)) { // This detects if the child is still running or not
unset($pids[$key]);
}
}
$pids = array_values($pids); // Reindex the array
}
$t=$t+1;
if($t==40)
{
sleep(5);
$t=0;
}
}