source: chapter07/rc.xml@ 8ef599c

10.0 10.0-rc1 10.1 10.1-rc1 11.0 11.0-rc1 11.0-rc2 11.0-rc3 11.1 11.1-rc1 11.2 11.2-rc1 11.3 11.3-rc1 12.0 12.0-rc1 12.1 12.1-rc1 6.0 6.1 6.1.1 6.3 6.4 6.5 6.6 6.7 6.8 7.0 7.1 7.2 7.3 7.4 7.5 7.5-systemd 7.6 7.6-systemd 7.7 7.7-systemd 7.8 7.8-systemd 7.9 7.9-systemd 8.0 8.1 8.2 8.3 8.4 9.0 9.1 arm bdubbs/gcc13 ml-11.0 multilib renodr/libudev-from-systemd s6-init trunk v3_0 v3_1 v3_2 v3_3 v4_0 v4_1 v5_0 v5_1 v5_1_1 xry111/arm64 xry111/arm64-12.0 xry111/clfs-ng xry111/lfs-next xry111/loongarch xry111/loongarch-12.0 xry111/loongarch-12.1 xry111/mips64el xry111/pip3 xry111/rust-wip-20221008 xry111/update-glibc
Last change on this file since 8ef599c was 8ef599c, checked in by Simon Perreault <nomis80@…>, 23 years ago

Removed blank lines after <literallayout> and before </literallayout>

git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@520 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

  • Property mode set to 100644
File size: 6.8 KB
Line 
1<sect1 id="ch07-rc">
2<title>Creating the rc script</title>
3
4<para>
5The first main boot script is the <filename>/etc/init.d/rc</filename> script.
6A new file <filename>/etc/init.d/rc</filename> is created containing the
7following: </para>
8
9<literallayout>
10<userinput>cat &gt; rc &lt;&lt; "EOF"</userinput>
11#!/bin/sh
12# Begin /etc/init.d/rc
13#
14# By Jason Pearce - jason.pearce@linux.org
15# Modified by Gerard Beekmans - gerard@linuxfromscratch.org
16# print_error_msg based on ideas by Simon Perreault -
17# nomis80@videotron.ca
18
19#
20# Include the functions declared in the /etc/init.d/functions file
21#
22
23source /etc/init.d/functions
24
25#
26# The print_error_msg function prints an error message when an unforeseen
27# error occurred that wasn't trapped for some reason by a evaluate_retval
28# call or error checking in different ways.
29
30print_error_msg()
31{
32
33 echo
34 $FAILURE
35 echo -n "You should not read this error message. It means "
36 echo "that an unforeseen error "
37 echo -n "took place and subscript $i exited with "
38 echo "a return value "
39 echo -n "of $error_value for an unknown reason. If you're able "
40 echo "to trace this error down "
41 echo -n "to a bug in one of the files provided by this book, "
42 echo "please be so kind to "
43 echo -n "inform us at lfs-discuss@linuxfromscratch.org"
44 $NORMAL
45 echo
46 echo
47 echo "Press a key to continue..."
48 read
49}
50
51#
52# If you uncomment the debug variable below none of the scripts will be
53# executed, just the script name and parameters will be echo'ed to the
54# screen so you can see how the scripts are called by rc.
55#
56
57# Un-comment the following for debugging.
58# debug=echo
59
60#
61# Start script or program.
62#
63startup() {
64
65 $debug $*
66
67}
68
69#
70# Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
71#
72
73trap ":" INT QUIT TSTP
74
75#
76# Now find out what the current and what the previous runlevel are. The
77# $RUNLEVEL variable is set by init for all it's children. This script
78# runs as a child of init.
79#
80
81runlevel=$RUNLEVEL
82
83#
84# Get first argument. Set new runlevel to this argument. If no runlevel
85# was passed to this script we won't change runlevels.
86#
87
88[ "$1" != "" ] &amp;&amp; runlevel=$1
89if [ "$runlevel" = "" ]
90then
91 echo "Usage: $0 &lt;runlevel&gt;" &gt;&amp;2
92 exit 1
93fi
94
95#
96# The same goes for $PREVLEVEL (see above for $RUNLEVEL). previous will
97# be set to the previous run level. If $PREVLEVEL is not set it means
98# that there is no previous runlevel and we'll set previous to N.
99#
100
101previous=$PREVLEVEL
102[ "$previous" = "" ] &amp;&amp; previous=N
103
104export runlevel previous
105
106#
107# Is there an rc directory for the new runlevel?
108#
109
110if [ -d /etc/rc$runlevel.d ]
111
112then
113
114#
115# If so, first collect all the K* scripts in the new run level.
116#
117
118 if [ $previous != N ]
119 then
120 for i in /etc/rc$runlevel.d/K*
121 do
122 [ ! -f $i ] &amp;&amp; continue
123
124#
125# the suffix variable will contain the script name without the leading
126# Kxxx
127#
128
129 suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9][0-9]}
130#
131# If there is a start script for this K script in the previous runlevel
132# determine what it's full path is
133#
134 previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix
135#
136# If there was no previous run level it could be that something was
137# started in rcS.d (sysinit level) so we'll determine the path for that
138# possibility as well.
139#
140
141 sysinit_start=/etc/rcS.d/S[0-9][0-9][0-9]$suffix
142
143#
144# Stop the service if there is a start script in the previous run level
145# or in the sysinit level. If previous_start or sysinit_start do not
146# exist the 'continue' command is run which causes the script to abort
147# this iteration of the for loop and continue with the next iteration.
148# This boils down to that it won't run the commands after the next two
149# lines and start over from the top of this for loop. See man bash for
150# more info on this.
151#
152
153 [ ! -f $previous_start ] &amp;&amp;
154 [ ! -f $sysinit_start ] &amp;&amp; continue
155
156#
157# If we found previous_start or sysinit_start, run the K script
158#
159
160 startup $i stop
161 error_value=$?
162#
163# If the return value of the script is not 0, something went wrong with
164# error checking inside the script. the print_error_msg function will be
165# called and the message plus the return value of the K script will be
166# printed to the screen
167#
168
169 if [ $error_value != 0 ]
170 then
171 print_error_msg
172 fi
173
174 done
175 fi
176
177#
178# Now run the START scripts for this runlevel.
179#
180
181 for i in /etc/rc$runlevel.d/S*
182 do
183 [ ! -f $i ] &amp;&amp; continue
184
185 if [ $previous != N ]
186 then
187#
188# Find start script in previous runlevel and stop script in this
189# runlevel.
190#
191
192 suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9][0-9]}
193 stop=/etc/rc$runlevel.d/K[0-9][0-9][0-9]$suffix
194 previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix
195#
196# If there is a start script in the previous level and no stop script in
197# this level, we don't have to re-start the service; abort this
198# iteration and start the next one.
199#
200
201 [ -f $previous_start ] &amp;&amp; [ ! -f $stop ] &amp;&amp;
202 continue
203 fi
204
205 case "$runlevel" in
206 0|6)
207
208#
209# levels 0 and 6 are halt and reboot levels. We don't really start
210# anything here so we call with the 'stop' parameter
211#
212
213 startup $i stop
214 error_value=$?
215#
216# If the return value of the script is not 0, something went wrong with
217# error checking inside the script. the print_error_msg function will be
218# called and the message plus the return value of the K script will be
219# printed to the screen
220#
221
222 if [ $error_value != 0 ]
223 then
224 print_error_msg
225 fi
226 ;;
227 *)
228 startup $i start
229 error_value=$?
230#
231# If the return value of the script is not 0, something went wrong with
232# error checking inside the script. the print_error_msg function will be
233# called and the message plus the return value of the K script will be
234# printed to the screen
235#
236
237 if [ $error_value != 0 ]
238 then
239 print_error_msg
240 fi
241 ;;
242 esac
243 done
244fi
245
246# End /etc/init.d/rc
247<userinput>EOF</userinput>
248</literallayout>
249
250</sect1>
251
Note: See TracBrowser for help on using the repository browser.