source: bootscripts/lfs/init.d/functions@ f874424

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 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 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 f874424 was f874424, checked in by Bruce Dubbs <bdubbs@…>, 13 years ago

Rename /etc/sysconfig/init_params to /etc/sysconfig/rc.site.
Move network services to /lib/services.
Move init-functions to /lib/lsb.
Make /lib/lsb a symlink to /lib/services.
Create convenience symlink /etc/init.d->/etc/rc.d/init.d
Add help and man pages to ifup/ifdown.

Append /run/var/bootlog to /var/log/boot.log at the end of
the boot sequence.

Add capability to step through the boot scripts at boot time.

Optionally allow environment variables in sysconfig directory's
console, network, and clock files to be placed in rc.site.

Add an optional FASTBOOT parameter to set /fastboot when rebooting.

Remove a minor warning message from udev that is triggered
by the udev_retry boot script.

Add SKIPTMPCLEAN as an optional parameter to skip cleaning /tmp at boot time.

Add a page to Chapter 7 documenting rc.site.

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

  • Property mode set to 100644
File size: 19.0 KB
Line 
1#!/bin/sh
2########################################################################
3# Begin boot functions
4#
5# Description : Run Level Control Functions
6#
7# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
8# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
9#
10# Version : LFS 7.0
11#
12# Notes : With code based on Matthias Benkmann's simpleinit-msb
13# http://winterdrache.de/linux/newboot/index.html
14#
15# This file is only present for backward BLFS compatibility
16#
17########################################################################
18
19# Set any needed environment variables e.g. HEADLESS
20. /lib/lsb/init_params
21
22## Environmental setup
23# Setup default values for environment
24umask 022
25export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
26
27# Signal sent to running processes to refresh their configuration
28RELOADSIG="HUP"
29
30# Number of seconds between STOPSIG and FALLBACK when stopping processes
31KILLDELAY="3"
32
33## Screen Dimensions
34# Find current screen size
35if [ -z "${COLUMNS}" ]; then
36 COLUMNS=$(stty size)
37 COLUMNS=${COLUMNS##* }
38fi
39
40# When using remote connections, such as a serial port, stty size returns 0
41if [ "${COLUMNS}" = "0" ]; then
42 COLUMNS=80
43fi
44
45## Measurements for positioning result messages
46COL=$((${COLUMNS} - 8))
47WCOL=$((${COL} - 2))
48
49## Provide an echo that supports -e and -n
50# If formatting is needed, $ECHO should be used
51case "`echo -e -n test`" in
52 -[en]*)
53 ECHO=/bin/echo
54 ;;
55 *)
56 ECHO=echo
57 ;;
58esac
59
60## Set Cursor Position Commands, used via $ECHO
61SET_COL="\\033[${COL}G" # at the $COL char
62SET_WCOL="\\033[${WCOL}G" # at the $WCOL char
63CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char
64
65## Set color commands, used via $ECHO
66# Please consult `man console_codes for more information
67# under the "ECMA-48 Set Graphics Rendition" section
68#
69# Warning: when switching from a 8bit to a 9bit font,
70# the linux console will reinterpret the bold (1;) to
71# the top 256 glyphs of the 9bit font. This does
72# not affect framebuffer consoles
73NORMAL="\\033[0;39m" # Standard console grey
74SUCCESS="\\033[1;32m" # Success is green
75WARNING="\\033[1;33m" # Warnings are yellow
76FAILURE="\\033[1;31m" # Failures are red
77INFO="\\033[1;36m" # Information is light cyan
78BRACKET="\\033[1;34m" # Brackets are blue
79
80STRING_LENGTH="0" # the length of the current message
81
82#*******************************************************************************
83# Function - boot_mesg()
84#
85# Purpose: Sending information from bootup scripts to the console
86#
87# Inputs: $1 is the message
88# $2 is the colorcode for the console
89#
90# Outputs: Standard Output
91#
92# Dependencies: - sed for parsing strings.
93# - grep for counting string length.
94#
95# Todo:
96#*******************************************************************************
97boot_mesg()
98{
99 local ECHOPARM=""
100
101 while true
102 do
103 case "${1}" in
104 -n)
105 ECHOPARM=" -n "
106 shift 1
107 ;;
108 -*)
109 echo "Unknown Option: ${1}"
110 return 1
111 ;;
112 *)
113 break
114 ;;
115 esac
116 done
117
118 ## Figure out the length of what is to be printed to be used
119 ## for warning messages.
120 STRING_LENGTH=$((${#1} + 1))
121
122 # Print the message to the screen
123 ${ECHO} ${ECHOPARM} -e "${2}${1}"
124
125 # Log the message
126 [ -d /run/var ] || return
127 ${ECHO} ${ECHOPARM} -e "${2}${1}" >> /run/var/bootlog
128}
129
130boot_mesg_flush()
131{
132 # Reset STRING_LENGTH for next message
133 STRING_LENGTH="0"
134}
135
136echo_ok()
137{
138 ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${SUCCESS} OK ${BRACKET}]"
139 ${ECHO} -e "${NORMAL}"
140 boot_mesg_flush
141
142 [ -d /run/var ] || return
143 ${ECHO} -e "[ OK ]" >> /run/var/bootlog
144}
145
146echo_failure()
147{
148 ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${FAILURE} FAIL ${BRACKET}]"
149 ${ECHO} -e "${NORMAL}"
150 boot_mesg_flush
151
152 [ -d /run/var ] || return
153 ${ECHO} -e "[ FAIL]" >> /run/var/bootlog
154}
155
156echo_warning()
157{
158 ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} WARN ${BRACKET}]"
159 ${ECHO} -e "${NORMAL}"
160 boot_mesg_flush
161
162 [ -d /run/var ] || return
163 ${ECHO} -e "[ WARN ]" >> /run/var/bootlog
164}
165
166echo_skipped()
167{
168 ${ECHO} -n -e "${CURS_UP}${SET_COL}${BRACKET}[${WARNING} SKIP ${BRACKET}]"
169 ${ECHO} -e "${NORMAL}"
170 boot_mesg_flush
171
172 [ -d /run/var ] || return
173 ${ECHO} -e " [ SKIP ]" >> /run/var/bootlog
174}
175
176wait_for_user()
177{
178 # Wait for the user by default
179 [ "${HEADLESS=0}" = "0" ] && read ENTER
180}
181
182evaluate_retval()
183{
184 error_value="${?}"
185
186 if [ ${error_value} = 0 ]; then
187 echo_ok
188 else
189 echo_failure
190 fi
191
192 # This prevents the 'An Unexpected Error Has Occurred' from trivial
193 # errors.
194 return 0
195}
196
197print_status()
198{
199 if [ "${#}" = "0" ]; then
200 echo "Usage: ${0} {success|warning|failure}"
201 return 1
202 fi
203
204 case "${1}" in
205
206 success)
207 echo_ok
208 ;;
209
210 warning)
211 # Leave this extra case in because old scripts
212 # may call it this way.
213 case "${2}" in
214 running)
215 ${ECHO} -e -n "${CURS_UP}"
216 ${ECHO} -e -n "\\033[${STRING_LENGTH}G "
217 boot_mesg "Already running." ${WARNING}
218 echo_warning
219 ;;
220 not_running)
221 ${ECHO} -e -n "${CURS_UP}"
222 ${ECHO} -e -n "\\033[${STRING_LENGTH}G "
223 boot_mesg "Not running." ${WARNING}
224 echo_warning
225 ;;
226 not_available)
227 ${ECHO} -e -n "${CURS_UP}"
228 ${ECHO} -e -n "\\033[${STRING_LENGTH}G "
229 boot_mesg "Not available." ${WARNING}
230 echo_warning
231 ;;
232 *)
233 # This is how it is supposed to
234 # be called
235 echo_warning
236 ;;
237 esac
238 ;;
239
240 failure)
241 echo_failure
242 ;;
243
244 esac
245
246}
247
248reloadproc()
249{
250 local pidfile=""
251 local failure=0
252
253 while true
254 do
255 case "${1}" in
256 -p)
257 pidfile="${2}"
258 shift 2
259 ;;
260 -*)
261 log_failure_msg "Unknown Option: ${1}"
262 return 2
263 ;;
264 *)
265 break
266 ;;
267 esac
268 done
269
270 if [ "${#}" -lt "1" ]; then
271 log_failure_msg "Usage: reloadproc [-p pidfile] pathname"
272 return 2
273 fi
274
275 # This will ensure compatibility with previous LFS Bootscripts
276 if [ -n "${PIDFILE}" ]; then
277 pidfile="${PIDFILE}"
278 fi
279
280 # Is the process running?
281 if [ -z "${pidfile}" ]; then
282 pidofproc -s "${1}"
283 else
284 pidofproc -s -p "${pidfile}" "${1}"
285 fi
286
287 # Warn about stale pid file
288 if [ "$?" = 1 ]; then
289 boot_mesg -n "Removing stale pid file: ${pidfile}. " ${WARNING}
290 rm -f "${pidfile}"
291 fi
292
293 if [ -n "${pidlist}" ]; then
294 for pid in ${pidlist}
295 do
296 kill -"${RELOADSIG}" "${pid}" || failure="1"
297 done
298
299 (exit ${failure})
300 evaluate_retval
301
302 else
303 boot_mesg "Process ${1} not running." ${WARNING}
304 echo_warning
305 fi
306}
307
308statusproc()
309{
310 local pidfile=""
311 local base=""
312 local ret=""
313
314 while true
315 do
316 case "${1}" in
317 -p)
318 pidfile="${2}"
319 shift 2
320 ;;
321 -*)
322 log_failure_msg "Unknown Option: ${1}"
323 return 2
324 ;;
325 *)
326 break
327 ;;
328 esac
329 done
330
331 if [ "${#}" != "1" ]; then
332 shift 1
333 log_failure_msg "Usage: statusproc [-p pidfile] pathname"
334 return 2
335 fi
336
337 # Get the process basename
338 base="${1##*/}"
339
340 # This will ensure compatibility with previous LFS Bootscripts
341 if [ -n "${PIDFILE}" ]; then
342 pidfile="${PIDFILE}"
343 fi
344
345 # Is the process running?
346 if [ -z "${pidfile}" ]; then
347 pidofproc -s "${1}"
348 else
349 pidofproc -s -p "${pidfile}" "${1}"
350 fi
351
352 # Store the return status
353 ret=$?
354
355 if [ -n "${pidlist}" ]; then
356 ${ECHO} -e "${INFO}${base} is running with Process"\
357 "ID(s) ${pidlist}.${NORMAL}"
358 else
359 if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; then
360 ${ECHO} -e "${WARNING}${1} is not running but"\
361 "/var/run/${base}.pid exists.${NORMAL}"
362 else
363 if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
364 ${ECHO} -e "${WARNING}${1} is not running"\
365 "but ${pidfile} exists.${NORMAL}"
366 else
367 ${ECHO} -e "${INFO}${1} is not running.${NORMAL}"
368 fi
369 fi
370 fi
371
372 # Return the status from pidofproc
373 return $ret
374}
375
376# The below functions are documented in the LSB-generic 2.1.0
377
378#*******************************************************************************
379# Function - pidofproc [-s] [-p pidfile] pathname
380#
381# Purpose: This function returns one or more pid(s) for a particular daemon
382#
383# Inputs: -p pidfile, use the specified pidfile instead of pidof
384# pathname, path to the specified program
385#
386# Outputs: return 0 - Success, pid's in stdout
387# return 1 - Program is dead, pidfile exists
388# return 2 - Invalid or excessive number of arguments,
389# warning in stdout
390# return 3 - Program is not running
391#
392# Dependencies: pidof, echo, head
393#
394# Todo: Remove dependency on head
395# This replaces getpids
396# Test changes to pidof
397#
398#*******************************************************************************
399pidofproc()
400{
401 local pidfile=""
402 local lpids=""
403 local silent=""
404 pidlist=""
405 while true
406 do
407 case "${1}" in
408 -p)
409 pidfile="${2}"
410 shift 2
411 ;;
412
413 -s)
414 # Added for legacy opperation of getpids
415 # eliminates several '> /dev/null'
416 silent="1"
417 shift 1
418 ;;
419 -*)
420 log_failure_msg "Unknown Option: ${1}"
421 return 2
422 ;;
423 *)
424 break
425 ;;
426 esac
427 done
428
429 if [ "${#}" != "1" ]; then
430 shift 1
431 log_failure_msg "Usage: pidofproc [-s] [-p pidfile] pathname"
432 return 2
433 fi
434
435 if [ -n "${pidfile}" ]; then
436 if [ ! -r "${pidfile}" ]; then
437 return 3 # Program is not running
438 fi
439
440 lpids=`head -n 1 ${pidfile}`
441 for pid in ${lpids}
442 do
443 if [ "${pid}" -ne "$$" -a "${pid}" -ne "${PPID}" ]; then
444 kill -0 "${pid}" 2>/dev/null &&
445 pidlist="${pidlist} ${pid}"
446 fi
447
448 if [ "${silent}" != "1" ]; then
449 echo "${pidlist}"
450 fi
451
452 test -z "${pidlist}" &&
453 # Program is dead, pidfile exists
454 return 1
455 # else
456 return 0
457 done
458
459 else
460 pidlist=`pidof -o $$ -o $PPID -x "$1"`
461 if [ "${silent}" != "1" ]; then
462 echo "${pidlist}"
463 fi
464
465 # Get provide correct running status
466 if [ -n "${pidlist}" ]; then
467 return 0
468 else
469 return 3
470 fi
471
472 fi
473
474 if [ "$?" != "0" ]; then
475 return 3 # Program is not running
476 fi
477}
478
479#*******************************************************************************
480# Function - loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]
481#
482# Purpose: This runs the specified program as a daemon
483#
484# Inputs: -f, run the program even if it is already running
485# -n nicelevel, specifies a nice level. See nice(1).
486# -p pidfile, uses the specified pidfile
487# pathname, pathname to the specified program
488# args, arguments to pass to specified program
489#
490# Outputs: return 0 - Success
491# return 2 - Invalid of excessive number of arguments,
492# warning in stdout
493# return 4 - Program or service status is unknown
494#
495# Dependencies: nice, rm
496#
497# Todo: LSB says this should be called start_daemon
498# LSB does not say that it should call evaluate_retval
499# It checks for PIDFILE, which is deprecated.
500# Will be removed after BLFS 6.0
501# loadproc returns 0 if program is already running, not LSB compliant
502#
503#*******************************************************************************
504loadproc()
505{
506 local pidfile=""
507 local forcestart=""
508 local nicelevel="10"
509
510# This will ensure compatibility with previous LFS Bootscripts
511 if [ -n "${PIDFILE}" ]; then
512 pidfile="${PIDFILE}"
513 fi
514
515 while true
516 do
517 case "${1}" in
518 -f)
519 forcestart="1"
520 shift 1
521 ;;
522 -n)
523 nicelevel="${2}"
524 shift 2
525 ;;
526 -p)
527 pidfile="${2}"
528 shift 2
529 ;;
530 -*)
531 log_failure_msg "Unknown Option: ${1}"
532 return 2 #invalid or excess argument(s)
533 ;;
534 *)
535 break
536 ;;
537 esac
538 done
539
540 if [ "${#}" = "0" ]; then
541 log_failure_msg "Usage: loadproc [-f] [-n nicelevel] [-p pidfile] pathname [args]"
542 return 2 #invalid or excess argument(s)
543 fi
544
545 if [ -z "${forcestart}" ]; then
546 if [ -z "${pidfile}" ]; then
547 pidofproc -s "${1}"
548 else
549 pidofproc -s -p "${pidfile}" "${1}"
550 fi
551
552 case "${?}" in
553 0)
554 log_warning_msg "Unable to continue: ${1} is running"
555 return 0 # 4
556 ;;
557 1)
558 boot_mesg "Removing stale pid file: ${pidfile}" ${WARNING}
559 rm -f "${pidfile}"
560 ;;
561 3)
562 ;;
563 *)
564 log_failure_msg "Unknown error code from pidofproc: ${?}"
565 return 4
566 ;;
567 esac
568 fi
569
570 nice -n "${nicelevel}" "${@}"
571 evaluate_retval # This is "Probably" not LSB compliant,
572# but required to be compatible with older bootscripts
573 return 0
574}
575
576#*******************************************************************************
577# Function - killproc [-p pidfile] pathname [signal]
578#
579# Purpose:
580#
581# Inputs: -p pidfile, uses the specified pidfile
582# pathname, pathname to the specified program
583# signal, send this signal to pathname
584#
585# Outputs: return 0 - Success
586# return 2 - Invalid of excessive number of arguments,
587# warning in stdout
588# return 4 - Unknown Status
589#
590# Dependencies: kill, rm
591#
592# Todo: LSB does not say that it should call evaluate_retval
593# It checks for PIDFILE, which is deprecated.
594# Will be removed after BLFS 6.0
595#
596#*******************************************************************************
597killproc()
598{
599 local pidfile=""
600 local killsig=TERM # default signal is SIGTERM
601 pidlist=""
602
603 # This will ensure compatibility with previous LFS Bootscripts
604 if [ -n "${PIDFILE}" ]; then
605 pidfile="${PIDFILE}"
606 fi
607
608 while true
609 do
610 case "${1}" in
611 -p)
612 pidfile="${2}"
613 shift 2
614 ;;
615 -*)
616 log_failure_msg "Unknown Option: ${1}"
617 return 2
618 ;;
619 *)
620 break
621 ;;
622 esac
623 done
624
625 if [ "${#}" = "2" ]; then
626 killsig="${2}"
627 elif [ "${#}" != "1" ]; then
628 shift 2
629 log_failure_msg "Usage: killproc [-p pidfile] pathname [signal]"
630 return 2
631 fi
632
633 # Is the process running?
634 if [ -z "${pidfile}" ]; then
635 pidofproc -s "${1}"
636 else
637 pidofproc -s -p "${pidfile}" "${1}"
638 fi
639
640 # Remove stale pidfile
641 if [ "$?" = 1 ]; then
642 boot_mesg "Removing stale pid file: ${pidfile}." ${WARNING}
643 rm -f "${pidfile}"
644 fi
645
646 # If running, send the signal
647 if [ -n "${pidlist}" ]; then
648 for pid in ${pidlist}
649 do
650 kill -${killsig} ${pid} 2>/dev/null
651
652 # Wait up to 3 seconds, for ${pid} to terminate
653 case "${killsig}" in
654 TERM|SIGTERM|KILL|SIGKILL)
655 # sleep in 1/10ths of seconds and
656 # multiply KILLDELAY by 10
657 local dtime="${KILLDELAY}0"
658 while [ "${dtime}" != "0" ]
659 do
660 kill -0 ${pid} 2>/dev/null || break
661 sleep 0.1
662 dtime=$(( ${dtime} - 1))
663 done
664 # If ${pid} is still running, kill it
665 kill -0 ${pid} 2>/dev/null && kill -KILL ${pid} 2>/dev/null
666 ;;
667 esac
668 done
669
670 # Check if the process is still running if we tried to stop it
671 case "${killsig}" in
672 TERM|SIGTERM|KILL|SIGKILL)
673 if [ -z "${pidfile}" ]; then
674 pidofproc -s "${1}"
675 else
676 pidofproc -s -p "${pidfile}" "${1}"
677 fi
678
679 # Program was terminated
680 if [ "$?" != "0" ]; then
681 # Remove the pidfile if necessary
682 if [ -f "${pidfile}" ]; then
683 rm -f "${pidfile}"
684 fi
685 echo_ok
686 return 0
687 else # Program is still running
688 echo_failure
689 return 4 # Unknown Status
690 fi
691 ;;
692 *)
693 # Just see if the kill returned successfully
694 evaluate_retval
695 ;;
696 esac
697 else # process not running
698 print_status warning not_running
699 fi
700}
701
702
703#*******************************************************************************
704# Function - log_success_msg "message"
705#
706# Purpose: Print a success message
707#
708# Inputs: $@ - Message
709#
710# Outputs: Text output to screen
711#
712# Dependencies: echo
713#
714# Todo: logging
715#
716#*******************************************************************************
717log_success_msg()
718{
719 ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
720 ${ECHO} -e "${SET_COL}""${BRACKET}""[""${SUCCESS}"" OK ""${BRACKET}""]""${NORMAL}"
721
722 [ -d /run/var ] || return 0
723 ${ECHO} -n -e "${@} [ OK ]" >> /run/var/bootlog
724 return 0
725}
726
727#*******************************************************************************
728# Function - log_failure_msg "message"
729#
730# Purpose: Print a failure message
731#
732# Inputs: $@ - Message
733#
734# Outputs: Text output to screen
735#
736# Dependencies: echo
737#
738# Todo: logging
739#
740#*******************************************************************************
741log_failure_msg() {
742 ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
743 ${ECHO} -e "${SET_COL}""${BRACKET}""[""${FAILURE}"" FAIL ""${BRACKET}""]""${NORMAL}"
744
745 [ -d /run/var ] || return 0
746 ${ECHO} -e "${@} [ FAIL ]" >> /run/var/bootlog
747 return 0
748}
749
750#*******************************************************************************
751# Function - log_warning_msg "message"
752#
753# Purpose: print a warning message
754#
755# Inputs: $@ - Message
756#
757# Outputs: Text output to screen
758#
759# Dependencies: echo
760#
761# Todo: logging
762#
763#*******************************************************************************
764log_warning_msg() {
765 ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
766 ${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" WARN ""${BRACKET}""]""${NORMAL}"
767
768 [ -d /run/var ] || return 0
769 ${ECHO} -e "${@} [ WARN ]" >> /run/var/bootlog
770 return 0
771}
772
773#*******************************************************************************
774# Function - log_skipped_msg "message"
775#
776# Purpose: print a message that the script was skipped
777#
778# Inputs: $@ - Message
779#
780# Outputs: Text output to screen
781#
782# Dependencies: echo
783#
784# Todo: logging
785#
786#*******************************************************************************
787log_skipped_msg() {
788 ${ECHO} -n -e "${BOOTMESG_PREFIX}${@}"
789 ${ECHO} -e "${SET_COL}""${BRACKET}""[""${WARNING}"" SKIP ""${BRACKET}""]""${NORMAL}"
790
791 [ -d /run/var ] || return 0
792 ${ECHO} -e "${@} [ SKIP ]" >> /run/var/bootlog
793 return 0
794}
795
796# End boot functions
Note: See TracBrowser for help on using the repository browser.