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;
}

在以“reincarnate”值返回后,新的工作进程调用posix_setsid,它返回一个新的会话 ID。但是如果这个进程崩溃了,主进程也会默默退出。

是否可以防止这种行为并使整个系统更加健壮?

4

1 回答 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

}

于 2012-11-06T13:43:00.157 回答