From 5c88229f50f8732e633c205bd0b39ba335ffc2bb Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 10 Nov 2017 09:18:18 +0100 Subject: [PATCH 1/2] s4:samba: Allow samba daemon to run in foreground We are passing the no_process_group to become_daemon() that setsid() is not called. In case we are double forking, we run in SysV daemon mode, setsid() should be called! See: https://www.freedesktop.org/software/systemd/man/daemon.html BUG: https://bugzilla.samba.org/show_bug.cgi?id=13129 Signed-off-by: Andreas Schneider Reviewed-by: Andrew Bartlett (cherry picked from commit 8736013dc42c5755b75bbb2e843a290bcd545909) --- source3/smbd/server.c | 2 +- source4/smbd/server.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 181bcd1e123..252b43190d7 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1592,7 +1592,7 @@ extern void build_options(bool screen); struct poptOption long_options[] = { POPT_AUTOHELP {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)" }, - {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)"}, + {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon) and log to stdout"}, {"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FORK, "Run daemon in foreground (for daemontools, etc.)" }, {"no-process-group", '\0', POPT_ARG_NONE, NULL, OPT_NO_PROCESS_GROUP, "Don't create a new process group" }, {"log-stdout", 'S', POPT_ARG_NONE, NULL, OPT_LOG_STDOUT, "Log to stdout" }, diff --git a/source4/smbd/server.c b/source4/smbd/server.c index aeec439e0a0..4ddaf41bc06 100644 --- a/source4/smbd/server.c +++ b/source4/smbd/server.c @@ -348,6 +348,7 @@ static int binary_smbd_main(const char *binary_name, const char *argv[]) { bool opt_daemon = false; + bool opt_fork = true; bool opt_interactive = false; int opt; poptContext pc; @@ -362,6 +363,7 @@ static int binary_smbd_main(const char *binary_name, struct stat st; enum { OPT_DAEMON = 1000, + OPT_FOREGROUND, OPT_INTERACTIVE, OPT_PROCESS_MODEL, OPT_SHOW_BUILD @@ -370,6 +372,8 @@ static int binary_smbd_main(const char *binary_name, POPT_AUTOHELP {"daemon", 'D', POPT_ARG_NONE, NULL, OPT_DAEMON, "Become a daemon (default)", NULL }, + {"foreground", 'F', POPT_ARG_NONE, NULL, OPT_FOREGROUND, + "Run the daemon in foreground", NULL }, {"interactive", 'i', POPT_ARG_NONE, NULL, OPT_INTERACTIVE, "Run interactive (not a daemon)", NULL}, {"model", 'M', POPT_ARG_STRING, NULL, OPT_PROCESS_MODEL, @@ -392,6 +396,9 @@ static int binary_smbd_main(const char *binary_name, case OPT_DAEMON: opt_daemon = true; break; + case OPT_FOREGROUND: + opt_fork = false; + break; case OPT_INTERACTIVE: opt_interactive = true; break; @@ -415,7 +422,7 @@ static int binary_smbd_main(const char *binary_name, "not allowed together with -D|--daemon\n\n"); poptPrintUsage(pc, stderr, 0); return 1; - } else if (!opt_interactive) { + } else if (!opt_interactive && !opt_fork) { /* default is --daemon */ opt_daemon = true; } @@ -451,8 +458,8 @@ static int binary_smbd_main(const char *binary_name, } if (opt_daemon) { - DEBUG(3,("Becoming a daemon.\n")); - become_daemon(true, false, false); + DBG_NOTICE("Becoming a daemon.\n"); + become_daemon(opt_fork, opt_no_process_group, false); } /* Create the memory context to hang everything off. */ -- 2.15.0 From 71113e45933fe5d31f10ebb93bde7e9ed49ac77e Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 10 Nov 2017 09:32:27 +0100 Subject: [PATCH 2/2] systemd: Start processes in forground and without a process group We should not double fork in notify mode or systemd think something during startup will be wrong and send SIGTERM to the process. So sometimes the daemon will not start up correctly. systemd will also handle the process group. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13129 Signed-off-by: Andreas Schneider Reviewed-by: Andrew Bartlett (cherry picked from commit 8b6f58194da7e849cdb9d20712dff49b17a93a77) --- packaging/systemd/nmb.service | 2 +- packaging/systemd/samba.service | 2 +- packaging/systemd/smb.service | 2 +- packaging/systemd/winbind.service | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packaging/systemd/nmb.service b/packaging/systemd/nmb.service index 992c0cd9d2b..71c93d6088b 100644 --- a/packaging/systemd/nmb.service +++ b/packaging/systemd/nmb.service @@ -7,7 +7,7 @@ Type=notify NotifyAccess=all PIDFile=/run/nmbd.pid EnvironmentFile=-/etc/sysconfig/samba -ExecStart=/usr/sbin/nmbd $NMBDOPTIONS +ExecStart=/usr/sbin/nmbd --foreground --no-process-group $NMBDOPTIONS ExecReload=/usr/bin/kill -HUP $MAINPID LimitCORE=infinity diff --git a/packaging/systemd/samba.service b/packaging/systemd/samba.service index 824f89c2030..1b64c3b779d 100644 --- a/packaging/systemd/samba.service +++ b/packaging/systemd/samba.service @@ -8,7 +8,7 @@ NotifyAccess=all PIDFile=/run/samba.pid LimitNOFILE=16384 EnvironmentFile=-/etc/sysconfig/samba -ExecStart=/usr/sbin/samba $SAMBAOPTIONS +ExecStart=/usr/sbin/samba --foreground --no-process-group $SAMBAOPTIONS ExecReload=/usr/bin/kill -HUP $MAINPID [Install] diff --git a/packaging/systemd/smb.service b/packaging/systemd/smb.service index 6053a5caaa5..adf6684c7d9 100644 --- a/packaging/systemd/smb.service +++ b/packaging/systemd/smb.service @@ -8,7 +8,7 @@ NotifyAccess=all PIDFile=/run/smbd.pid LimitNOFILE=16384 EnvironmentFile=-/etc/sysconfig/samba -ExecStart=/usr/sbin/smbd $SMBDOPTIONS +ExecStart=/usr/sbin/smbd --foreground --no-process-group $SMBDOPTIONS ExecReload=/usr/bin/kill -HUP $MAINPID LimitCORE=infinity diff --git a/packaging/systemd/winbind.service b/packaging/systemd/winbind.service index c511488166e..46b3797251d 100644 --- a/packaging/systemd/winbind.service +++ b/packaging/systemd/winbind.service @@ -7,7 +7,7 @@ Type=notify NotifyAccess=all PIDFile=/run/winbindd.pid EnvironmentFile=-/etc/sysconfig/samba -ExecStart=/usr/sbin/winbindd "$WINBINDOPTIONS" +ExecStart=/usr/sbin/winbindd --foreground --no-process-group "$WINBINDOPTIONS" ExecReload=/usr/bin/kill -HUP $MAINPID LimitCORE=infinity -- 2.15.0