mirror of
git://github.com/lxc/lxc
synced 2025-09-01 22:39:36 +00:00
dual-fork for daemonized fork in lxcapi-start
So the container will be reparented by init. Otherwise children of the lxc-start might be reaped by python3 rather than lxc-start. Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
committed by
Stéphane Graber
parent
59b3bc264c
commit
697fa6390c
@@ -265,8 +265,15 @@ static bool lxcapi_wait(struct lxc_container *c, char *state, int timeout)
|
|||||||
static bool wait_on_daemonized_start(struct lxc_container *c)
|
static bool wait_on_daemonized_start(struct lxc_container *c)
|
||||||
{
|
{
|
||||||
/* we'll probably want to make this timeout configurable? */
|
/* we'll probably want to make this timeout configurable? */
|
||||||
int timeout = 5;
|
int timeout = 5, ret, status;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* our child is going to fork again, then exit. reap the
|
||||||
|
* child
|
||||||
|
*/
|
||||||
|
ret = wait(&status);
|
||||||
|
if (ret == -1 || !WIFEXITED(status) || WEXITSTATUS(status) != 0)
|
||||||
|
DEBUG("failed waiting for first dual-fork child");
|
||||||
return lxcapi_wait(c, "RUNNING", timeout);
|
return lxcapi_wait(c, "RUNNING", timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,6 +332,14 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char ** argv)
|
|||||||
}
|
}
|
||||||
if (pid != 0)
|
if (pid != 0)
|
||||||
return wait_on_daemonized_start(c);
|
return wait_on_daemonized_start(c);
|
||||||
|
/* second fork to be reparented by init */
|
||||||
|
pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
SYSERROR("Error doing dual-fork");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pid != 0)
|
||||||
|
exit(0);
|
||||||
/* like daemon(), chdir to / and redirect 0,1,2 to /dev/null */
|
/* like daemon(), chdir to / and redirect 0,1,2 to /dev/null */
|
||||||
if (chdir("/")) {
|
if (chdir("/")) {
|
||||||
SYSERROR("Error chdir()ing to /.");
|
SYSERROR("Error chdir()ing to /.");
|
||||||
|
Reference in New Issue
Block a user