General note on rc scripts and daemonizing
Doug Barton
dougb at FreeBSD.org
Tue Jul 20 22:38:47 UTC 2010
On Tue, 20 Jul 2010, Greg Larkin wrote:
> Ed Schouten wrote:
>> 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.
Unfortunately not all port maintainers follow this list, so you're not
off the hook yet. :) I did a quick and dirty grep for this problem and
it looks like it affects about 76 ports, so not an overwhelming number,
but not a quick afternoon's work either.
>> I've seen various cases in the past where people write rc scripts that
>> do the following:
>>
>> command="/usr/local/bin/dog"
>> command_args="--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. :-)
Thanks for your excellent analysis of this problem, it's very useful
information.
>> 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 at . Maybe we should add some kind of built-in
>> functionality to call daemon(8)? ]
In theory, yes. Currently daemon(8) is located in /usr/sbin which could
be problematic for people doing diskless, but in practice I don't know
of any ports rc.d scripts that start so early that this would be a
problem. If it turns out that it is, we can always move it to /sbin.
> Anyway, here are some examples for daemonizing processes that don't
> already have support for doing it themselves:
>
> Daemonizing an executable without internal daemon support:
> http://www.freebsd.org/cgi/cvsweb.cgi/ports/mail/nullmailer/files/nullmailer.in?rev=1.3;content-type=text%2Fplain
>
> Daemonizing a Python script:
> http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/viewvc/files/viewvc.in?rev=1.4;content-type=text%2Fplain
>
> I would love to see direct support for these use cases in /etc/rc.subr,
> and am interested in working with someone to add it.
Your first example looks right, I don't know enough about python to
comment on the second. There is also
http://www.freebsd.org/cgi/query-pr.cgi?pr=conf/90163 which has some
insight into this. I previously closed that PR, but now it may be time
to revisit this problem.
I heartily encourage you to go forward if you're interested in patching
rc.subr to take care of this. However, there will have to be a ramp-up
period since even if you fix it today, you have about 3 years before you
can guarantee that users on all supported versions of FreeBSD have the
code in rc.subr (which is one of the unstated reasons that I closed the
PR mentioned above).
Here is my perspective on the project:
1. Document the issue in
http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/rc-scripts.html
and give examples of how to do it properly.
2. Contact authors of existing ports that have this issue, and point
them to the documentation. Offer help to fix it.
3. Take a page from pgolluci's book and file PRs with fixes for those
who don't respond in a timely manner, then use the "maintainer timeout"
facility to finish the fixes.
4. After 1., but perhaps in parallel with 2. and 3.; develop a patch for
rc.subr to handle this, perhaps starting with the simple cases. The
patch should include a signaling mechanism so that a port rc.d script
can do something equivalent to:
if [ $rc_subr_with_daemon_fix ]; then
do it the easy way
else
do it the hard way
fi
5. Once there is a new mechanism, repeat the steps in 1-3. :)
6. In 3-4 years, remove the crutches and mandate use of the new
mechanism.
One could also argue that documentation and education are the right
answers, and that patching rc.subr is not necessary. Personally I'm
sympathetic to that line of reasoning, but I'd never want to discourage
someone from improving rc.subr.
If you, or anyone are interested in pursuing any part of this then I'm
happy to help review patches, make suggestions, etc. but I am not going
to be able to own the project, I don't have the time. I would suggest
that starting a new thread on -rc would be the right way to move
forward.
hth,
Doug
--
Improve the effectiveness of your Internet presence with
a domain name makeover! http://SupersetSolutions.com/
Computers are useless. They can only give you answers.
-- Pablo Picasso
More information about the freebsd-rc
mailing list