diff --git a/src/cli.c b/src/cli.c index a64ce8aa2..05baf85ee 100644 --- a/src/cli.c +++ b/src/cli.c @@ -2526,6 +2526,14 @@ static int _send_status(char **args, char *payload, struct appctx *appctx, void kill(proc->pid, oldpids_sig); } } + + /* At this point we are sure, that newly forked worker is started, + * so we can write our PID in a pidfile, if provided. Master doesn't + * perform chroot. + */ + if (global.pidfile != NULL) + handle_pidfile(); + load_status = 1; ha_notice("Loading success.\n"); diff --git a/src/haproxy.c b/src/haproxy.c index fd77f3545..1efa4a8b3 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -3370,10 +3370,6 @@ int main(int argc, char **argv) if ((getenv("HAPROXY_MWORKER_REEXEC") == NULL) && (global.mode & MODE_DAEMON)) apply_daemon_mode(); - /* Open pid file before the chroot */ - if ((global.mode & MODE_DAEMON || global.mode & MODE_MWORKER) && global.pidfile != NULL) - handle_pidfile(); - /* Master-worker and program forks */ if (global.mode & MODE_MWORKER) { /* fork and run binary from command keyword in program section */ @@ -3528,6 +3524,15 @@ int main(int argc, char **argv) } } + /* Open PID file before the chroot. In master-worker mode, it's master + * who will create the pidfile, see _send_status(). + */ + if (!(global.mode & MODE_MWORKER)) { + if (global.mode & MODE_DAEMON && (global.pidfile != NULL)) { + handle_pidfile(); + } + } + /* Must chroot and setgid/setuid in the children */ /* chroot if needed */ if (global.chroot != NULL) {