From: William Lallemand Date: Wed, 4 Jul 2018 13:31:23 +0000 (+0200) Subject: MINOR: startup: change session/process group settings X-Git-Tag: v1.9-dev1~181 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfd8eb590908f1f326d3da214197f0fff7788435;p=thirdparty%2Fhaproxy.git MINOR: startup: change session/process group settings Change the way the process groups are set. Indeed setsid() was called for every processes which caused the worker to have a different process group than the master. This patch behave in a better way: - In daemon mode only, each child do a setsid() - In master worker + daemon mode, the setsid() is done in the master before forking the children - In any foreground mode, we don't do a setsid() Could be backported in 1.8 but the master-worker mode is mostly used with systemd which rely on cgroups so that won't affect much people. --- diff --git a/src/haproxy.c b/src/haproxy.c index 4101cefa1b..e19d89abfb 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2775,10 +2775,10 @@ int main(int argc, char **argv) ha_alert("[%s.main()] Cannot fork.\n", argv[0]); protocol_unbind_all(); exit(1); /* there has been an error */ - } - /* parent leave to daemonize */ - if (ret > 0) + } else if (ret > 0) { /* parent leave to daemonize */ exit(0); + } else /* change the process group ID in the child (master process) */ + setsid(); } if (global.mode & MODE_MWORKER) { @@ -2880,7 +2880,6 @@ int main(int argc, char **argv) global.mode &= ~MODE_VERBOSE; global.mode |= MODE_QUIET; /* ensure that we won't say anything from now */ - setsid(); } mworker_wait(); @@ -3005,7 +3004,8 @@ int main(int argc, char **argv) global.mode |= MODE_QUIET; /* ensure that we won't say anything from now */ } pid = getpid(); /* update child's pid */ - setsid(); + if (!(global.mode & MODE_MWORKER)) /* in mworker mode we don't want a new pgid for the children */ + setsid(); fork_poller(); }