2012-11-06 51 views
3

我有一些用PHP编写的linux守护进程来完成一些后台工作。 有一个“主”过程有时会通过pcntl_fork产生工作进程并对其进行控制。守护进程PHP:主进程在子进程崩溃时退出

这里是(很简单)的代码:

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。但是如果这个过程崩溃了,那个主人也会默默退出。

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

回答

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 

}