I scanned quickly through the source of relevant packages. The following lines caught my eye (upstart-0.6.5/init/job_process.c around line 1394):
nih_info (_("%s %s process (%d) became new process (%d)"), job_name (job), process_name (process), job->pid[process], (pid_t)data);
/* We no longer care about this process, it's the child that we're
* interested in from now on, so detach it and allow it to go about
* its business unhindered.
*/
The comment here is revealing. statd takes care not to let its parent process exit until the child is ready to service client requests. I think the sysvinit startup scripts depended on this. If upstart completely ignores the parent as soon as it has forked, this would introduce a race as per theory B above.
I scanned quickly through the source of relevant packages. The following lines caught my eye (upstart- 0.6.5/init/ job_process. c around line 1394):
nih_info (_("%s %s process (%d) became new process (%d)"),
job_ name (job), process_name (process),
job- >pid[process] , (pid_t)data);
/* We no longer care about this process, it's the child that we're
* interested in from now on, so detach it and allow it to go about
* its business unhindered.
*/
The comment here is revealing. statd takes care not to let its parent process exit until the child is ready to service client requests. I think the sysvinit startup scripts depended on this. If upstart completely ignores the parent as soon as it has forked, this would introduce a race as per theory B above.