Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Jul 2010 12:56:58 +0200
From:      Ed Schouten <ed@80386.nl>
To:        ports@FreeBSD.org
Cc:        rc@FreeBSD.org
Subject:   General note on rc scripts and daemonizing
Message-ID:  <20100717105658.GV1742@hoeg.nl>

next in thread | raw e-mail | index | archive | help

--m+Z5/NEwv9nnRDo7
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hello port maintainers,

I think I'd better send an email about this to ports@, because I've seen
it in various places and it is getting a bit tiresome to mail all port
authors individually.

I've seen various cases in the past where people write rc scripts that
do the following:

	command=3D"/usr/local/bin/dog"
	command_args=3D"--bark > /dev/null 2>&1 &"

So in this case `dog --bark' doesn't daemonize itself, so the & is
sufficient here, right? Well, it is not. :-) The point is that we simply
tell the kernel to redirect stdout/stderr and run it in the background.
It doesn't tell the kernel that the process should run in a separate
session (see getsid(2)/setsid(2)).

This has various implications. The most important one I can think of, is
that the daemon can still do open("/dev/tty", ...) if it wants and spam
your TTY, even if the daemon is running as user `nobody'. This also
means that if you run the rc script from within a pseudo-terminal, it
can never actually destroy the pseudo-terminal for you, because maybe
the daemon is interested in using it.

Below is the output of `pstat -t' on one of my systems, where I decided
to fire up MySQL:

|       LINE   INQ  CAN  LIN  LOW  OUTQ  USE  LOW   COL  SESS  PGID STATE
| ...
|     pts/11     0    0    0    0     0    0    0     0 82711     0 G

The kernel actually wants to clean up this pseudo-terminal (state =3D G),
but it is prevented from doing so. It will only clean it up by the time
MySQL is shut down.

So how can this be solved? We already have a tool in base called
daemon(8). It is simply a wrapper around daemon(3) (which calls
setsid(2), which you can use to daemonize processes. So the next time
you write an rc script and need to daemonize something which cannot do
it by itself, please think of the kittens. ;-)

[ CCing this to rc@. Maybe we should add some kind of built-in
functionality to call daemon(8)? ]

--=20
 Ed Schouten <ed@80386.nl>
 WWW: http://80386.nl/

--m+Z5/NEwv9nnRDo7
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.15 (FreeBSD)

iEYEARECAAYFAkxBjHoACgkQ52SDGA2eCwW9eACePfuAF5ru1p/VB0hOdtBhCXzD
GooAnjOnQln6tR2XRY93kWnlG0OEL6HA
=uzUz
-----END PGP SIGNATURE-----

--m+Z5/NEwv9nnRDo7--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100717105658.GV1742>