PHP守护进程:当子进程崩溃时,主进程退出

3

我有一些用PHP编写的Linux守护程序来执行后台任务。

其中有一个“主”进程,有时会通过pcntl_fork创建工作进程并对它们进行控制。

以下是(非常简单的)代码:

private function SpawnWorker($realm, $parallelismKey)
{
  $pid = pcntl_fork();

  if ($pid)
  {
    $worker = DaemonInstance::Create($pid, $realm, $parallelismKey);
    $worker->Store();
    $this->workers[$pid] = $worker;
    return $worker;
  }

  else if ($pid == 0) //  we're in child process now
    return Daemon::REINCARNATE;

  else
    xechonl("#red#UNABLE TO SPAWN A WORKER ($realm, $parallelismKey)");

  return false;
}

新的工作进程在返回“转生”值后调用posix_setsid,并返回一个新的会话 ID。但是,如果该进程崩溃,主进程也会静默退出。

有没有可能防止这种行为,使整个系统更加健壮?

1个回答

0
您正在父进程中创建新的工作进程,而不是在子进程中。这是我使用的一些标准代码:
$pid = pcntl_fork();
if ($pid == -1) {
    // could not daemonize
    exit(1);
} elseif ($pid > 0) {
    exit(0); // already daemonized (we are the parent process)
} else {
    umask(0);
    $sid = posix_setsid();
    if ($sid < 0) {
        exit(1); // could not detach session id (could not create child)
    }

    // capture output and errors
    fclose(STDIN); fclose(STDOUT); fclose(STDERR);
    $STDIN = fopen('/dev/null', 'r');
    $STDOUT = fopen('/dev/null', 'wb');
    $STDERR = fopen('/dev/null', 'wb');

    // ADD CODE HERE

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接