3

いくつかのバックグラウンド作業を行うために PHP で書かれた Linux デーモンがいくつかあります。ワーカー プロセスを生成しpcntl_forkて制御する「マスター」プロセスが 1 つあります。

これが(非常に簡単な)コードです:

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 に答える