目标: 父进程作为守护进程,监控子进程(worker), 子进程挂掉,父进程立刻fork一个新的子进程。
问题:首次启动父进程的时候,伴随一个子进程。kill 子进程,父进程捕获SIGCHLD 信号,重新fork,看起来没啥问题。再kill 刚刚fork的子进程,没作用,求解
<?php
$workerIDs = [];
$pid = pcntl_fork();
if ($pid == -1) {
exit('fork failed');
}elseif ($pid == 0) {
pcntl_signal(SIGTERM, 'close');
echo "child\n";
handle();
}else{
echo "parent\n";
pcntl_signal(SIGCHLD, 'refork');
pcntl_signal(SIGTERM, 'closeAll');
$workerIDs[] = $pid;
while(1) {
pcntl_signal_dispatch();
sleep(1);
}
}
// worker 中的逻辑方法
function handle()
{
while(1) {
pcntl_signal_dispatch();
echo "child step1".PHP_EOL;
sleep(2);
echo "child step2".PHP_EOL;
sleep(2);
echo "child step3".PHP_EOL;
sleep(2);
}
}
// worker进程 SIGTERM信号 执行方法
function close()
{
$pid = posix_getpid();
echo "child($pid) close \n";
exit(0);
}
// 父进程 SIGCHID 信号执行方法
function refork()
{
global $workerIDs;
echo "parent refork\n";
$res = pcntl_wait($status);
echo "res:$res\n";
if ($res > 0 && isset($workerIDs[$res])) {
unset($workerIDs[$res]);
}
$pid = pcntl_fork();
if ($pid == -1) {
exit('fork failed');
}elseif ($pid == 0) {
pcntl_signal(SIGTERM, 'close');
handle();
}else{
/*pcntl_signal(SIGCHLD, 'refork');
pcntl_signal(SIGTERM, 'closeAll');*/
$workerIDs[] = $pid;
}
echo "new child $pid \n";
}
// 父进程 SIGTERM信号 执行方法
function closeAll()
{
global $workerIDs;
foreach ($workerIDs as $v) {
posix_kill($v, SIGTERM);
pcntl_waitpid($v,$status);
}
echo "close all".PHP_EOL;
exit(0);
}
请问解决了吗,也遇到这个问题了