Revised article on rc.d
David Thompson
dat1965 at yahoo.com
Mon Oct 9 18:56:21 PDT 2006
--- Yar Tikhiy <yar at comp.chem.msu.su> wrote:
> After a long delay, I got down to my article on rc.d again. Many
> thanks to Gary W. Swearingen for his valuable remarks. The new
> version is available at http://people.freebsd.org/~yar/rcng/ . I
> think this version can be added to our articles collection after a
> few corrections that may be suggested by the readers. ;-)
Regarding this paragraph,
Note: An rc.d script must be written in the sh(1) language. It
cannot be a binary executable because rc.d can opt to feed such
scripts into a single instance of sh(1) instead of running each
of them separately. This is controlled by an rc.conf(5) variable
named rc_fast_and_loose. An rc.d script cannot be written in
awk(1) or an interpreted language from ports for the same reason;
in addition, it must be runnable early in the system startup
sequence, before /usr has been mounted.
This caveat is not really true in the strict technical sense.
Consider if someone adds this line to their /etc/rc.d script,
# KEYWORD: nostart
then /etc/rc will not execute this script since rcorder is
invoked with '-s nostart'. Thus the reasoning due to the
$rc_fast_and_loose variable is not strictly accurate. That
is, a script could technically be written in any interpreted
language that happens to use '#' as its comment character;
as long as the above comment line was added to the script.
The problem is, of course, such scripts have to provide their
own scaffolding, since rc.subr is written in sh(1); and the
script cannot be run directly by /etc/rc due to the use of the
sh(1) dot '.' operator (thus it needs 'KEYWORD: nostart' so
that /etc/rc will skip it).
Although not exactly clear in the above paragraph, the reason
files in /etc/rc.d cannot be binary is because rc.d uses the
sh(1) dot '.' operator *for all* invocations, like this,
if [ -n "$rc_fast_and_loose" ]; then
set $_arg; . $_file
else
( trap "echo Script $_file interrupted; kill -QUIT $$" 3
trap "echo Script $_file interrupted; exit 1" 2
set $_arg; . $_file )
fi
But for '.', files in /etc/rc.d *could* be binary, but
even then rcorder expects to process text files, not binary
files. rcorder uses fparseln() to read each file, but this
doesn't really affect reading a binary file. Thus rcorder
processes binary files benignly, try 'rcorder /bin/*' and
you'll see consistent output.
Also in that paragraph, when I read this,
... a binary executable because rc.d can opt to feed ...
^^^^
IMHO, it should probably say,
... a binary executable because /etc/rc can opt to feed ...
^^^^^^^
though I understand you're referring to the rc.d system,
some clarity is gained in that sentence by using /etc/rc.
--
David
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the freebsd-rc
mailing list