PHP - 子进程阻止父母的SIGTERM

问题描述:

我遇到了有一个子进程有杀死父进程的问题 - 父进程正在等待子进程退出,并且只有在调用kill进程之后。当kill handler未安装时(pcntl_signal(SIGTERM,“kill_handler”))脚本立即终止。PHP - 子进程阻止父母的SIGTERM

我需要在提交kill命令终止父进程后立即通过kill处理函数收到信号。这个函数然后会杀死子进程。

任何想法?

如果您正在捕获信号,则必须在某个时间检查它们。如果挂在阻止文件waitpid()中,请在脚本的顶部使用declare(ticks=1);,或在循环中使用WNOHANG(可能为sleep ing),并调用pcntl_signal_dispatch()

这不起作用:

<?php 
declare(ticks=1); 
//rest of previous code 
?> 

没有蜱虫,这将让我们在SIGTERM父不死,但因为没有:

<?php 
pcntl_signal(SIGTERM, 'kill_handler'); 
function kill_handler($no){ 
     global $pid; 
     posix_kill($pid,SIGTERM); 
     echo 'Done killing '.$pid.PHP_EOL; 
     exit; 
} 
$pid = pcntl_fork(); 
if ($pid) { 
     echo 'Forked, parent is'.posix_getpid().PHP_EOL; 
     pcntl_waitpid($pid,$status); 
} else { 
     echo 'child '.posix_getpid().PHP_EOL; 
     $i = 0; 
     while($i++ < 30){ 
       echo date('H:i:s').PHP_EOL; 
       sleep(1); 
     } 
     echo 'done'.PHP_EOL; 
} 
?> 

这将在父&孩子一起孩子继续在孩子的信号调度:

<?php 
pcntl_signal(SIGTERM, 'kill_handler'); 
function kill_handler($no){ 
     global $pid; 
     posix_kill($pid,SIGTERM); 
     echo 'Done killing '.$pid.PHP_EOL; 
     exit; 
} 
$pid = pcntl_fork(); 
if ($pid) { 
     echo 'Forked, parent is'.posix_getpid().PHP_EOL; 
     while(0==pcntl_waitpid($pid,$status,WNOHANG)){ 
       echo "nothing yet".PHP_EOL; 
       pcntl_signal_dispatch(); 
       sleep(1); 
     } 
} else { 
     echo 'child '.posix_getpid().PHP_EOL; 
     $i = 0; 
     while($i++ < 30){ 
       echo date('H:i:s').PHP_EOL; 
       sleep(1); 
     } 
     echo 'done'.PHP_EOL; 
} 
?> 

所以eithe您必须在孩子身上拨打pcntl_signal_dispatch(),否则您只能在分叉后拨打pcntl_signal