smbd as a daemon

Alexander Bokovoy ab at samba.org
Wed Mar 26 06:03:27 MDT 2014


On Wed, Mar 26, 2014 at 9:47 AM, Andreas Schneider <asn at samba.org> wrote:
> On Tuesday 25 March 2014 21:52:34 Alexander Bokovoy wrote:
>> On Tue, Mar 25, 2014 at 9:38 PM, Jeremy Allison <jra at samba.org> wrote:
>> > On Tue, Mar 25, 2014 at 09:28:34PM +0200, Alexander Bokovoy wrote:
>> >> > Ok, attached patch compiles for me and links libsystem-daemon
>> >> > properly. I'm going to run some package tests tomorrow.
>> >>
>> >> Updated patch -- I forgot one define for non-systemd case and also
>> >> added changes to systemd services.
>> >
>> > Few comments inline.
>> >
>> >>   Become a daemon, discarding the controlling terminal.
>> >>
>> >>  ************************************************************************
>> >>  ****/>>
>> >> -_PUBLIC_ void become_daemon(bool do_fork, bool no_process_group, bool
>> >> log_stdout) +_PUBLIC_ void become_daemon(bool do_fork, bool
>> >> no_process_group, bool log_stdout, bool wait_for_child_init)>
>> > What is the extra parameter 'bool wait_for_child_init' for ?
>> > In the calling code you're always passing it as 'true' so
>> > what does it achieve ?
>>
>> I somehow thought I saw more become_daemon() uses. Looked again, I
>> don't see any more.
>> This should explain why I added it.
>>
>> >> -             become_daemon(Fork, no_process_group, log_stdout);
>> >> +             become_daemon(Fork, no_process_group, log_stdout, True);
>> >
>> > Bah. We don't use 'True' anymore. If you do end up
>> > keeping the parameter please use 'true/false' in all
>> > new code.
>>
>> Yes, changed it several times and missed here.
>>
>> > Otherwise looks ok to me.
>>
>> Updated patch attached, removed changes to become_daemon() prototype.
>
> The manpage states:
>
> A daemon could send the following shortly before exiting, on failure
>
> sd_notifyf(0, "STATUS=Failed to start up: %s\n"
>               "ERRNO=%i",
>               strerror(errno),
>               errno);
>
>
> So I would like to see
>
> static void exit_smbd(const char *msg, int error)
> {
> #ifdef HAVE_SYSTEMD
>         if (msg == NULL) {
>                 msg = strerror(error);
>         }
>
>         sd_notifyf(0, "STATUS=smbd failed to start: %s\n"
>                       "ERRNO=%i",
>                       msg,
>                       errno);
> #endif
>         DEBUG(0, "STATUS=smbd failed to start: %s\n", msg);
>         exit(1);
> }
>
>
> and then call this function if init fails in main().

Ok, I've now have a version that works. The only issue I see is when
systemd stops the service, it unconditionally removes pid file and
then our pid removal code complaints that pid file is not there.
----------------------------------------------------------------------------------------------------------------------------------
# LANG=en_US.utf8 journalctl -b -u smb -x
Mar 26 13:44:23 masteripa.ipa.weald.vda.li systemd[1]: Starting Samba
SMB Daemon...
-- Subject: Unit smb.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit smb.service has begun starting up.
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11031]: [2014/03/26
13:44:23.350824,  0] ../source3/smbd/server.c:1278(main)
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11031]: standard input
is not a socket, assuming -D option
Mar 26 13:44:23 masteripa.ipa.weald.vda.li systemd[1]: smb.service:
Supervising process 11032 which is not our child. We'll most likely
not notice when it exits.
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 1
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 1
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 1
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 2
Mar 26 13:44:24 masteripa.ipa.weald.vda.li systemd[1]: Started Samba SMB Daemon.
-- Subject: Unit smb.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit smb.service has finished starting up.
-- 
-- The start-up result is done.

# LANG=en_US.utf8 systemctl status -l smb
smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled)
   Active: active (running) since Wed 2014-03-26 13:44:24 EET; 3min 25s ago
 Main PID: 11032 (smbd)
   Status: "Serving client connections..."
   CGroup: /system.slice/smb.service
           ├─11032 /usr/sbin/smbd
           ├─11034 /usr/sbin/smbd
           ├─11035 /usr/sbin/smbd
           ├─11036 /usr/sbin/smbd
           ├─11037 /usr/sbin/smbd
           ├─11038 /usr/sbin/smbd
           ├─11039 /usr/sbin/smbd
           └─11040 /usr/sbin/smbd

Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11031]: [2014/03/26
13:44:23.350824,  0] ../source3/smbd/server.c:1278(main)
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11031]: standard input
is not a socket, assuming -D option
Mar 26 13:44:23 masteripa.ipa.weald.vda.li systemd[1]: smb.service:
Supervising process 11032 which is not our child. We'll most likely
not notice when it exits.
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 1
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 1
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 1
Mar 26 13:44:23 masteripa.ipa.weald.vda.li smbd[11032]: GSSAPI client step 2
Mar 26 13:44:24 masteripa.ipa.weald.vda.li systemd[1]: Started Samba SMB Daemon.
----------------------------------------------------------------------------------------------------------------------------------

Patch set is in
https://git.samba.org/?p=ab/samba.git/.git;a=shortlog;h=refs/heads/systemd
and version for v4-1-test is in
https://git.samba.org/?p=ab/samba.git/.git;a=shortlog;h=refs/heads/systemd-4.1
Fedora 20 packages are available at
http://copr.fedoraproject.org/coprs/abbra/samba-systemd-test/
-- 
/ Alexander Bokovoy


More information about the samba-technical mailing list