71723c0d4b0d4a43320a62bca2b44161f9aaf814
[dragonfly.git] / share / man / man8 / rc.subr.8
1 .\"     $NetBSD: rc.subr.8,v 1.9 2002/07/08 16:14:55 atatat Exp $
2 .\"     $FreeBSD: src/share/man/man8/rc.subr.8,v 1.3 2003/04/22 05:13:55 dougb Exp $
3 .\"     $DragonFly: src/share/man/man8/rc.subr.8,v 1.6 2008/09/06 21:31:21 swildner Exp $
4 .\" Copyright (c) 2002 The NetBSD Foundation, Inc.
5 .\" All rights reserved.
6 .\"
7 .\" This code is derived from software contributed to The NetBSD Foundation
8 .\" by Luke Mewburn.
9 .\"
10 .\" Redistribution and use in source and binary forms, with or without
11 .\" modification, are permitted provided that the following conditions
12 .\" are met:
13 .\" 1. Redistributions of source code must retain the above copyright
14 .\"    notice, this list of conditions and the following disclaimer.
15 .\" 2. Redistributions in binary form must reproduce the above copyright
16 .\"    notice, this list of conditions and the following disclaimer in the
17 .\"    documentation and/or other materials provided with the distribution.
18 .\" 3. All advertising materials mentioning features or use of this software
19 .\"    must display the following acknowledgement:
20 .\"     This product includes software developed by the NetBSD
21 .\"     Foundation, Inc. and its contributors.
22 .\" 4. Neither the name of The NetBSD Foundation nor the names of its
23 .\"    contributors may be used to endorse or promote products derived
24 .\"    from this software without specific prior written permission.
25 .\"
26 .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 .\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 .\" POSSIBILITY OF SUCH DAMAGE.
37 .\"
38 .Dd September 6, 2008
39 .Dt RC.SUBR 8
40 .Os
41 .Sh NAME
42 .Nm rc.subr
43 .Nd functions used by system shell scripts
44 .Sh SYNOPSIS
45 .Bl -item
46 .It
47 .Li . /etc/rc.subr
48 .It
49 .Ic backup_file Ar action Ar file Ar current Ar backup
50 .It
51 .Ic checkyesno Ar var
52 .It
53 .Ic check_pidfile Ar pidfile Ar procname Op Ar interpreter
54 .It
55 .Ic check_process Ar procname Op Ar interpreter
56 .It
57 .Ic debug Ar message
58 .It
59 .Ic err Ar exitval Ar message
60 .It
61 .Ic force_depend Ar name
62 .It
63 .Ic info Ar message
64 .It
65 .Ic load_rc_config Ar command
66 .It
67 .Ic mount_critical_filesystems Ar type
68 .It
69 .Ic rc_usage Ar command Op Ar ...
70 .It
71 .Ic reverse_list Ar item Op Ar ...
72 .It
73 .Ic run_rc_command Ar argument
74 .It
75 .Ic run_rc_script Ar file Ar argument
76 .It
77 .Ic set_rcvar Op Ar base
78 .It
79 .Ic wait_for_pids Op Ar pid Op Ar ...
80 .It
81 .Ic warn Ar message
82 .El
83 .Sh DESCRIPTION
84 .Nm
85 contains commonly used shell script functions and variable
86 definitions which are used by various scripts such as
87 .Xr rc 8 .
88 .Pp
89 The
90 .Nm
91 functions were mostly imported from
92 .Nx
93 and it is intended that they remain synced between the
94 two projects. With that in mind there are several variable
95 definitions that can help in this regard. They are:
96 .Bl -tag -width 4n
97 .It Ic OSTYPE
98 Its value will be either
99 .Dx Ns ,
100 .Fx Ns ,
101 or
102 .Nx ,
103 depending on which OS it is running on.
104 .It Ic SYSCTL
105 The path to the
106 .Xr sysctl 8
107 command.
108 .It Ic SYSCTL_N
109 The path and argument list to display only the
110 .Xr sysctl 8
111 values instead of a name=value pair.
112 .It Ic SYSCTL_W
113 The path and argument to write or modify
114 .Xr sysctl 8
115 values.
116 .El
117 .Pp
118 The
119 .Nm
120 functions are accessed by sourcing
121 .Pa /etc/rc.subr
122 into the current shell.
123 .Pp
124 The following shell functions are available:
125 .Bl -tag -width 4n
126 .It Xo
127 .Ic backup_file Ar action Ar file Ar current Ar backup
128 .Xc
129 Make a backup copy of
130 .Ar file
131 into
132 .Ar current .
133 If the
134 .Xr rc.conf 5
135 variable
136 .Sy backup_uses_rcs
137 is
138 .Sq YES ,
139 use
140 .Xr rcs 1
141 to archive the previous version of
142 .Ar current ,
143 otherwise save the previous version of
144 .Ar current
145 as
146 .Ar backup .
147 .Pp
148 .Ar action
149 may be one of the following:
150 .Bl -tag -width remove
151 .It Sy add
152 .Ar file
153 is now being backed up by or possibly re-entered into this backup mechanism.
154 .Ar current
155 is created, and if necessary, the
156 .Xr rcs 1
157 files are created as well.
158 .It Sy update
159 .Ar file
160 has changed and needs to be backed up.
161 If
162 .Ar current
163 exists, it is copied to
164 .Ar backup
165 or checked into
166 .Xr rcs 1
167 (if the repository file is old),
168 and then
169 .Ar file
170 is copied to
171 .Ar current .
172 .It Sy remove
173 .Ar file
174 is no longer being tracked by this backup mechanism.
175 If
176 .Xr rcs 1
177 is being used, an empty file is checked in and
178 .Ar current
179 is removed,
180 otherwise
181 .Ar current
182 is moved to
183 .Ar backup .
184 .El
185 .It Ic checkyesno Ar var
186 Return 0 if
187 .Ar var
188 is defined to
189 .Sq YES ,
190 .Sq TRUE ,
191 .Sq ON ,
192 or
193 .Sq 1 .
194 Return 1 if
195 .Ar var
196 is defined to
197 .Sq NO ,
198 .Sq FALSE ,
199 .Sq OFF ,
200 or
201 .Sq 0 .
202 Otherwise, warn that
203 .Ar var
204 is not set correctly.
205 The values are case insensitive.
206 .It Xo
207 .Ic check_pidfile
208 .Ar pidfile
209 .Ar procname
210 .Op Ar interpreter
211 .Xc
212 Parses the first word of the first line of
213 .Ar pidfile
214 for a PID, and ensures that the process with that PID
215 is running and its first argument matches
216 .Ar procname .
217 Prints the matching PID if successful, otherwise nothing.
218 If
219 .Ar interpreter
220 is provided, parse the first line of
221 .Ar procname ,
222 ensure that the line is of the form
223 .Dl #! interpreter [...]
224 and use
225 .Ar interpreter
226 with its optional arguments and
227 .Ar procname
228 appended as the process string to search for.
229 .It Ic check_process Ar procname Op Ar interpreter
230 Prints the PIDs of any processes that are running with a first
231 argument that matches
232 .Ar procname .
233 .Ar interpreter
234 is handled as per
235 .Ic check_pidfile .
236 .It Ic debug Ar message
237 Display a debugging message to
238 .Em stderr ,
239 log it to the system log using
240 .Xr logger 1 ,
241 and
242 return to the caller.
243 The error message consists of the script name
244 (from
245 .Sy $0 ) ,
246 followed by
247 .Dq ": DEBUG: " ,
248 and then
249 .Ar message .
250 This function is intended to be used by developers
251 as an aid to debugging scripts. It can be turned on or off
252 by the
253 .Xr rc.conf 5
254 variable
255 .Va rc_debug .
256 .It Ic err Ar exitval Ar message
257 Display an error message to
258 .Em stderr ,
259 log it to the system log
260 using
261 .Xr logger 1 ,
262 and
263 .Cm exit
264 with an exit value of
265 .Ar exitval .
266 The error message consists of the script name
267 (from
268 .Sy $0 ) ,
269 followed by
270 .Dq ": ERROR: " ,
271 and then
272 .Ar message .
273 .It Ic force_depend name
274 Output an advisory message and force the
275 .Ar name
276 service to start. The
277 .Ar name
278 argument is the
279 .Xr basename 1 ,
280 component of the path to the script, usually
281 .Em /etc/rc.d/name .
282 If the script fails for any reason it will output a warning
283 and return with a return value of 1. If it was successful
284 it will return 0.
285 .It Ic info Ar message
286 Display an informational message to
287 .Em stdout ,
288 and log it to the system log using
289 .Xr logger 1 .
290 The message consists of the script name
291 (from
292 .Sy $0 ) ,
293 followed by
294 .Dq ": INFO: " ,
295 and then
296 .Ar message .
297 The display of this informational output can be
298 turned on or off by the
299 .Xr rc.conf 5
300 variable
301 .Va rc_info .
302 .It Ic load_rc_config Ar command
303 Source in the configuration files for
304 .Ar command .
305 First,
306 .Pa /etc/rc.conf
307 is sourced if it has not yet been read in.
308 Then,
309 .Pa /etc/rc.conf.d/ Ns Ar command
310 is sourced if it is an existing file.
311 The latter may also contain other variable assignments to override
312 .Ic run_rc_command
313 arguments defined by the calling script, to provide an easy
314 mechanism for an administrator to override the behaviour of a given
315 .Xr rc.d 8
316 script without requiring the editing of that script.
317 .It Ic mount_critical_filesystems Ar type
318 Go through a list of critical file systems,
319 as found in the
320 .Xr rc.conf 5
321 variable
322 .Sy critical_filesystems_ Ns Ar type ,
323 mounting each one that
324 is not currently mounted.
325 .It Ic rc_usage Ar command Op Ar ...
326 Print a usage message for
327 .Sy $0 ,
328 with
329 .Ar commands
330 being the list of valid arguments
331 prefixed by
332 .Dq "[fast|force|one]" .
333 .It Ic reverse_list Ar item Op Ar ...
334 Print the list of
335 .Ar items
336 in reverse order.
337 .It Ic run_rc_command Ar argument
338 Run the
339 .Ar argument
340 method for the current
341 .Xr rc.d 8
342 script, based on the settings of various shell variables.
343 .Ic run_rc_command
344 is extremely flexible, and allows fully functional
345 .Xr rc.d 8
346 scripts to be implemented in a small amount of shell code.
347 .Pp
348 .Ar argument
349 is searched for in the list of supported commands, which may be one
350 of:
351 .Dl start stop restart rcvar
352 as well as any word listed in the optional variable
353 .Sy extra_commands .
354 If
355 .Sy pidfile
356 or
357 .Sy procname
358 is set, also allow:
359 .Dl status poll
360 .Pp
361 .Ar argument
362 may have one of the following prefixes which alters its operation:
363 .Bl -tag -width "Prefix" -offset indent -compact
364 .It Sy Prefix
365 .Sy Operation
366 .It Li fast
367 Skip the check for an existing running process,
368 and sets
369 .Sy rc_fast=YES .
370 .It Li force
371 Skip the checks for
372 .Sy rcvar
373 being set to yes,
374 and sets
375 .Sy rc_force=YES .
376 This ignores
377 .Ar argument Ns Sy _precmd
378 returning non-zero, and ignores any of the
379 .Sy required_*
380 tests failing .
381 .It Li one
382 Skip the checks for
383 .Sy rcvar
384 being set to yes, but performs all the other prerequisite tests.
385 .El
386 .Pp
387 .Ic run_rc_command
388 uses the following shell variables to control its behaviour.
389 Unless otherwise stated, these are optional.
390 .Bl -tag -width procname -offset indent
391 .It Sy name
392 The name of this script.
393 This is not optional.
394 .It Sy rcvar
395 The value of
396 .Sy rcvar
397 is checked with
398 .Ic checkyesno
399 to determine if this method should be run.
400 .It Sy command
401 Full path to the command.
402 Not required if
403 .Ar argument Ns Sy _cmd
404 is defined for each supported keyword.
405 .It Sy command_args
406 Optional arguments and/or shell directives for
407 .Sy command .
408 .It Sy command_interpreter
409 .Sy command
410 is started with
411 .Dl #! command_interpreter [...]
412 which results in its
413 .Xr ps 1
414 command being
415 .Dl command_interpreter [...] command
416 so use that string to find the PID(s) of the running command
417 rather than
418 .Ql command .
419 .It Sy extra_commands
420 Extra commands/keywords/arguments supported.
421 .It Sy pidfile
422 Path to pid file.
423 Used to determine the PID(s) of the running command.
424 If
425 .Sy pidfile
426 is set, use
427 .Dl check_pidfile $pidfile $procname
428 to find the PID.
429 Otherwise, if
430 .Sy command
431 is set, use
432 .Dl check_process $procname
433 to find the PID.
434 .It Sy procname
435 Process name to check for.
436 Defaults to the value of
437 .Sy command .
438 .It Sy required_dirs
439 Check for the existence of the listed directories
440 before running the default start method.
441 .It Sy required_files
442 Check for the readability of the listed files
443 before running the default start method.
444 .It Sy required_vars
445 Perform
446 .Ic checkyesno
447 on each of the list variables
448 before running the default start method.
449 .It Sy ${name}_chdir
450 Directory to
451 .Ic cd
452 to before running
453 .Sy command ,
454 if
455 .Sy ${name}_chroot
456 is not provided.
457 .It Sy ${name}_chroot
458 Directory to
459 .Xr chroot 8
460 to before running
461 .Sy command .
462 Only supported after
463 .Pa /usr
464 is mounted.
465 .It Sy ${name}_flags
466 Arguments to call
467 .Sy command
468 with.
469 This is usually set in
470 .Xr rc.conf 5 ,
471 and not in the
472 .Xr rc.d 8
473 script.
474 The environment variable
475 .Sq Ev flags
476 can be used to override this.
477 .It Sy ${name}_nice
478 .Xr nice 1
479 level to run
480 .Sy command
481 as.
482 Only supported after
483 .Pa /usr
484 is mounted.
485 .It Sy ${name}_user
486 User to run
487 .Sy command
488 as, using
489 .Xr chroot 8 .
490 if
491 .Sy ${name}_chroot
492 is set, otherwise
493 uses
494 .Xr su 1 .
495 Only supported after
496 .Pa /usr
497 is mounted.
498 .It Sy ${name}_group
499 Group to run the chrooted
500 .Sy command
501 as.
502 .It Sy ${name}_groups
503 Comma separated list of supplementary groups to run the chrooted
504 .Sy command
505 with.
506 .It Ar argument Ns Sy _cmd
507 Shell commands which override the default method for
508 .Ar argument .
509 .It Ar argument Ns Sy _precmd
510 Shell commands to run just before running
511 .Ar argument Ns Sy _cmd
512 or the default method for
513 .Ar argument .
514 If this returns a non-zero exit code, the main method is not performed.
515 If the default method is being executed, this check is performed after
516 the
517 .Sy required_*
518 checks and process (non-)existence checks.
519 .It Ar argument Ns Sy _postcmd
520 Shell commands to run if running
521 .Ar argument Ns Sy _cmd
522 or the default method for
523 .Ar argument
524 returned a zero exit code.
525 .It Sy sig_stop
526 Signal to send the processes to stop in the default
527 .Sy stop
528 method.
529 Defaults to
530 .Dv SIGTERM .
531 .It Sy sig_reload
532 Signal to send the processes to reload in the default
533 .Sy reload
534 method.
535 Defaults to
536 .Dv SIGHUP .
537 .El
538 .Pp
539 For a given method
540 .Ar argument ,
541 if
542 .Ar argument Ns Sy _cmd
543 is not defined, then a default method is provided by
544 .Sy run_rc_command :
545 .Bl -tag -width "argument" -offset indent
546 .It Sy Argument
547 .Sy Default method
548 .It Sy start
549 If
550 .Sy command
551 is not running and
552 .Ic checkyesno Sy rcvar
553 succeeds, start
554 .Sy command .
555 .It Sy stop
556 Determine the PIDs of
557 .Sy command
558 with
559 .Ic check_pidfile
560 or
561 .Ic check_process
562 (as appropriate),
563 .Ic kill Sy sig_stop
564 those PIDs, and run
565 .Ic wait_for_pids
566 on those PIDs.
567 .It Sy reload
568 Similar to
569 .Sy stop ,
570 except that it uses
571 .Sy sig_reload
572 instead, and doesn't run
573 .Ic wait_for_pids .
574 .It Sy restart
575 Runs the
576 .Sy stop
577 method, then the
578 .Sy start
579 method.
580 .It Sy status
581 Show the PID of
582 .Sy command ,
583 or some other script specific status operation.
584 .It Sy poll
585 Wait for
586 .Sy command
587 to exit.
588 .It Sy rcvar
589 Display which
590 .Xr rc.conf 5
591 variable is used (if any).
592 This method always works, even if the appropriate
593 .Xr rc.conf 5
594 variable is set to
595 .Sq NO .
596 .El
597 .Pp
598 The following variables are available to the methods
599 (such as
600 .Ar argument Ns Sy _cmd )
601 as well as after
602 .Ic run_rc_command
603 has completed:
604 .Bl -tag -width "rc_flags" -offset indent
605 .It Sy rc_arg
606 Argument provided to
607 .Sy run_rc_command ,
608 after fast and force processing has been performed.
609 .It Sy rc_flags
610 Flags to start the default command with.
611 Defaults to
612 .Sy ${name}_flags ,
613 unless overridden by the environment variable
614 .Sq Ev flags .
615 This variable may be changed by the
616 .Ar argument Ns Sy _precmd
617 method.
618 .It Sy rc_pid
619 PID of
620 .Sy command
621 (if appropriate).
622 .It Sy rc_fast
623 Not empty if
624 .Dq fast
625 prefix was used.
626 .It Sy rc_force
627 Not empty if
628 .Dq force
629 prefix was used.
630 .El
631 .It Ic run_rc_script Ar file Ar argument
632 Start the script
633 .Ar file
634 with an argument of
635 .Ar argument ,
636 and handle the return value from the script.
637 .Pp
638 Various shell variables are unset before
639 .Ar file
640 is started:
641 .Bd -ragged -offset indent
642 .Sy name ,
643 .Sy command ,
644 .Sy command_args ,
645 .Sy command_interpreter ,
646 .Sy extra_commands ,
647 .Sy pidfile ,
648 .Sy rcvar ,
649 .Sy required_dirs ,
650 .Sy required_files ,
651 .Sy required_vars ,
652 .Ar argument Ns Sy _cmd ,
653 .Ar argument Ns Sy _precmd .
654 .Ar argument Ns Sy _postcmd .
655 .Ed
656 .Pp
657 The startup behaviour of
658 .Ar file
659 depends upon the following checks:
660 .Bl -enum
661 .It
662 If
663 .Ar file
664 ends in
665 .Pa .sh ,
666 it is sourced into the current shell.
667 .It
668 If
669 .Ar file
670 appears to be a backup or scratch file
671 (e.g., with a suffix of
672 .Sq ~ ,
673 .Sq # ,
674 .Sq .OLD ,
675 or
676 .Sq .orig ) ,
677 ignore it.
678 .It
679 If
680 .Ar file
681 is not executable, ignore it.
682 .It
683 If the
684 .Xr rc.conf 5
685 variable
686 .Sy rc_fast_and_loose
687 is empty,
688 source
689 .Ar file
690 in a sub shell,
691 otherwise source
692 .Ar file
693 into the current shell.
694 .El
695 .It Ic set_rcvar Op Ar base
696 Set the variable name required to start a service. In
697 .Dx
698 a daemon is usually controlled by an
699 .Xr rc.conf 5
700 variable consisting of a daemon's name optionally postfixed by the string
701 .Sy "_enable" .
702 When the following line is included in a script
703 .Pp
704 .Dl rcvar=`set_rcvar`
705 .Pp
706 This function will use the value of the
707 .Sy $name
708 variable, which should be defined by the calling script, to construct the appropriate
709 .Xr rc.conf 5
710 knob. If the
711 .Ar base
712 argument is set it will use
713 .Ar base
714 instead of
715 .Sy $name .
716 .It Ic wait_for_pids Op Ar pid Op Ar ...
717 Wait until all of the provided
718 .Ar pids
719 don't exist any more, printing the list of outstanding
720 .Ar pids
721 every two seconds.
722 .It Ic warn Ar message
723 Display a warning message to
724 .Em stderr
725 and log it to the system log
726 using
727 .Xr logger 1 .
728 The warning message consists of the script name
729 (from
730 .Sy $0 ) ,
731 followed by
732 .Dq ": WARNING: " ,
733 and then
734 .Ar message .
735 .El
736 .Sh FILES
737 .Bl -tag -width /etc/rc.subr -compact
738 .It Pa /etc/rc.subr
739 The
740 .Nm
741 file resides in
742 .Pa /etc .
743 .El
744 .Sh SEE ALSO
745 .Xr rc.conf 5 ,
746 .Xr rc 8
747 .Sh HISTORY
748 .Nm
749 appeared in
750 .Nx 1.3 .
751 The
752 .Xr rc.d 8
753 support functions appeared in
754 .Nx 1.5 .
755 .Nm
756 first appeared in
757 .Fx 5.0 .