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
。