Source string Read only

(itstool) path: legalnotice/para
60/600
Context English State
_
translator-credits
Practical rc.d scripting in BSD
<email>yar@FreeBSD.org</email>
<personname><firstname>Yar</firstname><surname>Tikhiy</surname></personname><affiliation> <_:address-1/> </affiliation>
<year>2005</year> <year>2006</year> <year>2012</year> <holder>The FreeBSD Project</holder>
FreeBSD is a registered trademark of the FreeBSD Foundation.
NetBSD is a registered trademark of the NetBSD Foundation.
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the <quote>™</quote> or the <quote>®</quote> symbol.
$FreeBSD: head/en_US.ISO8859-1/articles/rc-scripting/article.xml 44709 2014-04-29 21:39:27Z wblock $
Beginners may find it difficult to relate the facts from the formal documentation on the BSD <filename>rc.d</filename> framework with the practical tasks of <filename>rc.d</filename> scripting. In this article, we consider a few typical cases of increasing complexity, show <filename>rc.d</filename> features suited for each case, and discuss how they work. Such an examination should provide reference points for further study of the design and efficient application of <filename>rc.d</filename>.
Introduction
The historical BSD had a monolithic startup script, <filename>/etc/rc</filename>. It was invoked by <citerefentry><refentrytitle>init</refentrytitle><manvolnum>8</manvolnum></citerefentry> at system boot time and performed all userland tasks required for multi-user operation: checking and mounting file systems, setting up the network, starting daemons, and so on. The precise list of tasks was not the same in every system; admins needed to customize it. With few exceptions, <filename>/etc/rc</filename> had to be modified, and true hackers liked it.
The real problem with the monolithic approach was that it provided no control over the individual components started from <filename>/etc/rc</filename>. For instance, <filename>/etc/rc</filename> could not restart a single daemon. The system admin had to find the daemon process by hand, kill it, wait until it actually exited, then browse through <filename>/etc/rc</filename> for the flags, and finally type the full command line to start the daemon again. The task would become even more difficult and prone to errors if the service to restart consisted of more than one daemon or demanded additional actions. In a few words, the single script failed to fulfil what scripts are for: to make the system admin's life easier.
Later there was an attempt to split out some parts of <filename>/etc/rc</filename> for the sake of starting the most important subsystems separately. The notorious example was <filename>/etc/netstart</filename> to bring up networking. It did allow for accessing the network from single-user mode, but it did not integrate well into the automatic startup process because parts of its code needed to interleave with actions essentially unrelated to networking. That was why <filename>/etc/netstart</filename> mutated into <filename>/etc/rc.network</filename>. The latter was no longer an ordinary script; it comprised of large, tangled <citerefentry><refentrytitle>sh</refentrytitle><manvolnum>1</manvolnum></citerefentry> functions called from <filename>/etc/rc</filename> at different stages of system startup. However, as the startup tasks grew diverse and sophisticated, the <quote>quasi-modular</quote> approach became even more of a drag than the monolithic <filename>/etc/rc</filename> had been.
Without a clean and well-designed framework, the startup scripts had to bend over backwards to satisfy the needs of rapidly developing BSD-based operating systems. It became obvious at last that more steps are necessary on the way to a fine-grained and extensible <filename>rc</filename> system. Thus BSD <filename>rc.d</filename> was born. Its acknowledged fathers were Luke Mewburn and the NetBSD community. Later it was imported into FreeBSD. Its name refers to the location of system scripts for individual services, which is in <filename>/etc/rc.d</filename>. Soon we will learn about more components of the <filename>rc.d</filename> system and see how the individual scripts are invoked.
The basic ideas behind BSD <filename>rc.d</filename> are <emphasis>fine modularity</emphasis> and <emphasis>code reuse</emphasis>. <emphasis>Fine modularity</emphasis> means that each basic <quote>service</quote> such as a system daemon or primitive startup task gets its own <citerefentry><refentrytitle>sh</refentrytitle><manvolnum>1</manvolnum></citerefentry> script able to start the service, stop it, reload it, check its status. A particular action is chosen by the command-line argument to the script. The <filename>/etc/rc</filename> script still drives system startup, but now it merely invokes the smaller scripts one by one with the <option>start</option> argument. It is easy to perform shutdown tasks as well by running the same set of scripts with the <option>stop</option> argument, which is done by <filename>/etc/rc.shutdown</filename>. Note how closely this follows the Unix way of having a set of small specialized tools, each fulfilling its task as well as possible. <emphasis>Code reuse</emphasis> means that common operations are implemented as <citerefentry><refentrytitle>sh</refentrytitle><manvolnum>1</manvolnum></citerefentry> functions and collected in <filename>/etc/rc.subr</filename>. Now a typical script can be just a few lines' worth of <citerefentry><refentrytitle>sh</refentrytitle><manvolnum>1</manvolnum></citerefentry> code. Finally, an important part of the <filename>rc.d</filename> framework is <citerefentry><refentrytitle>rcorder</refentrytitle><manvolnum>8</manvolnum></citerefentry>, which helps <filename>/etc/rc</filename> to run the small scripts orderly with respect to dependencies between them. It can help <filename>/etc/rc.shutdown</filename>, too, because the proper order for the shutdown sequence is opposite to that of startup.
The BSD <filename>rc.d</filename> design is described in <link linkend="lukem">the original article by Luke Mewburn</link>, and the <filename>rc.d</filename> components are documented in great detail in <link linkend="manpages">the respective manual pages</link>. However, it might not appear obvious to an <filename>rc.d</filename> newbie how to tie the numerous bits and pieces together in order to create a well-styled script for a particular task. Therefore this article will try a different approach to describe <filename>rc.d</filename>. It will show which features should be used in a number of typical cases, and why. Note that this is not a how-to document because our aim is not at giving ready-made recipes, but at showing a few easy entrances into the <filename>rc.d</filename> realm. Neither is this article a replacement for the relevant manual pages. Do not hesitate to refer to them for more formal and complete documentation while reading this article.
There are prerequisites to understanding this article. First of all, you should be familiar with the <citerefentry><refentrytitle>sh</refentrytitle><manvolnum>1</manvolnum></citerefentry> scripting language in order to master <filename>rc.d</filename>. In addition, you should know how the system performs userland startup and shutdown tasks, which is described in <citerefentry><refentrytitle>rc</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
This article focuses on the FreeBSD branch of <filename>rc.d</filename>. Nevertheless, it may be useful to NetBSD developers, too, because the two branches of BSD <filename>rc.d</filename> not only share the same design but also stay similar in their aspects visible to script authors.
Outlining the task
A little consideration before starting <envar>$EDITOR</envar> will not hurt. In order to write a well-tempered <filename>rc.d</filename> script for a system service, we should be able to answer the following questions first:
ComponentTranslation
This translation Translated FreeBSD Doc/articles_rc-scripting
FreeBSD is a registered trademark of the FreeBSD Foundation.
Following strings have same context and same source.
Translated FreeBSD Doc/articles_linux-users
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_freebsd-releng
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_gjournal-desktop
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_fonts
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_cups
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_explaining-bsd
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_freebsd-questions
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_freebsd-update-server
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_geom-class
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_hubs
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_filtering-bridge
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_nanobsd
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_pr-guidelines
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_problem-reports
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_serial-uart
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_ldap-auth
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_linux-emulation
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_new-users
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_solid-state
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/books_faq
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_contributors
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_releng
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_remote-install
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_vm-design
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/books_arch-handbook
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_ipsec-must
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_pam
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/books_porters-handbook
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/books_handbook
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/books_developers-handbook
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_bsdl-gpl
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_building-products
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_committers-guide
FreeBSD is a registered trademark of the FreeBSD Foundation.
Translated FreeBSD Doc/articles_contributing
FreeBSD is a registered trademark of the FreeBSD Foundation.

Loading…

No matching activity found.

Browse all component changes

Glossary

English English
No related strings found in the glossary.

Source information

Source string comment
(itstool) path: legalnotice/para
Labels
No labels currently set.
Flags
read-only
Source string location
article.translate.xml:20
Source string age
11 months ago
Translation file
string