1.\" $NetBSD: rc.subr.8,v 1.12 2004/01/06 00:52:24 lukem Exp $ 2.\" 3.\" Copyright (c) 2002-2004 The NetBSD Foundation, Inc. 4.\" All rights reserved. 5.\" 6.\" This code is derived from software contributed to The NetBSD Foundation 7.\" by Luke Mewburn. 8.\" 9.\" Redistribution and use in source and binary forms, with or without 10.\" modification, are permitted provided that the following conditions 11.\" are met: 12.\" 1. Redistributions of source code must retain the above copyright 13.\" notice, this list of conditions and the following disclaimer. 14.\" 2. Redistributions in binary form must reproduce the above copyright 15.\" notice, this list of conditions and the following disclaimer in the 16.\" documentation and/or other materials provided with the distribution. 17.\" 18.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28.\" POSSIBILITY OF SUCH DAMAGE. 29.\" 30.\" $FreeBSD$ 31.\" 32.Dd September 18, 2016 33.Dt RC.SUBR 8 34.Os 35.Sh NAME 36.Nm rc.subr 37.Nd functions used by system shell scripts 38.Sh SYNOPSIS 39.Bl -item -compact 40.It 41.Ic .\& Pa /etc/rc.subr 42.Pp 43.It 44.Ic backup_file Ar action Ar file Ar current Ar backup 45.It 46.Ic checkyesno Ar var 47.It 48.Ic check_pidfile Ar pidfile Ar procname Op Ar interpreter 49.It 50.Ic check_process Ar procname Op Ar interpreter 51.It 52.Ic debug Ar message 53.It 54.Ic err Ar exitval Ar message 55.It 56.Ic force_depend Ar name 57.It 58.Ic info Ar message 59.It 60.Ic load_kld Oo Fl e Ar regex Oc Oo Fl m Ar module Oc Ar file 61.It 62.Ic load_rc_config Ar name 63.It 64.Ic load_rc_config_var Ar name Ar var 65.It 66.Ic mount_critical_filesystems Ar type 67.It 68.Ic rc_usage Ar command ... 69.It 70.Ic reverse_list Ar item ... 71.It 72.Ic run_rc_command Ar argument 73.It 74.Ic run_rc_script Ar file Ar argument 75.It 76.Ic wait_for_pids Op Ar pid ... 77.It 78.Ic warn Ar message 79.El 80.Sh DESCRIPTION 81The 82.Nm 83script 84contains commonly used shell script functions and variable 85definitions which are used by various scripts such as 86.Xr rc 8 . 87Scripts required by ports in 88.Pa /usr/local/etc/rc.d 89will also eventually 90be rewritten to make use of it. 91.Pp 92The 93.Nm 94functions were mostly imported from 95.Nx . 96.Pp 97They are accessed by sourcing 98.Pa /etc/rc.subr 99into the current shell. 100.Pp 101The following shell functions are available: 102.Bl -tag -width 4n 103.It Ic backup_file Ar action file current backup 104Make a backup copy of 105.Ar file 106into 107.Ar current . 108Save the previous version of 109.Ar current 110as 111.Ar backup . 112.Pp 113The 114.Ar action 115argument 116may be one of the following: 117.Bl -tag -width ".Cm remove" 118.It Cm add 119.Ar file 120is now being backed up by or possibly re-entered into this backup mechanism. 121.Ar current 122is created. 123.It Cm update 124.Ar file 125has changed and needs to be backed up. 126If 127.Ar current 128exists, it is copied to 129.Ar backup 130and then 131.Ar file 132is copied to 133.Ar current . 134.It Cm remove 135.Ar file 136is no longer being tracked by this backup mechanism. 137.Ar current 138is moved to 139.Ar backup . 140.El 141.It Ic checkyesno Ar var 142Return 0 if 143.Ar var 144is defined to 145.Dq Li YES , 146.Dq Li TRUE , 147.Dq Li ON , 148or 149.Ql 1 . 150Return 1 if 151.Ar var 152is defined to 153.Dq Li NO , 154.Dq Li FALSE , 155.Dq Li OFF , 156or 157.Ql 0 . 158Otherwise, warn that 159.Ar var 160is not set correctly. 161The values are case insensitive. 162.Sy Note : 163.Ar var 164should be a variable name, not its value; 165.Ic checkyesno 166will expand the variable by itself. 167.It Ic check_pidfile Ar pidfile procname Op Ar interpreter 168Parses the first word of the first line of 169.Ar pidfile 170for a PID, and ensures that the process with that PID 171is running and its first argument matches 172.Ar procname . 173Prints the matching PID if successful, otherwise nothing. 174If 175.Ar interpreter 176is provided, parse the first line of 177.Ar procname , 178ensure that the line is of the form: 179.Pp 180.Dl "#! interpreter [...]" 181.Pp 182and use 183.Ar interpreter 184with its optional arguments and 185.Ar procname 186appended as the process string to search for. 187.It Ic check_process Ar procname Op Ar interpreter 188Prints the PIDs of any processes that are running with a first 189argument that matches 190.Ar procname . 191.Ar interpreter 192is handled as per 193.Ic check_pidfile . 194.It Ic debug Ar message 195Display a debugging message to 196.Va stderr , 197log it to the system log using 198.Xr logger 1 , 199and 200return to the caller. 201The error message consists of the script name 202(from 203.Va $0 ) , 204followed by 205.Dq Li ": DEBUG: " , 206and then 207.Ar message . 208This function is intended to be used by developers 209as an aid to debugging scripts. 210It can be turned on or off 211by the 212.Xr rc.conf 5 213variable 214.Va rc_debug . 215.It Ic err Ar exitval message 216Display an error message to 217.Va stderr , 218log it to the system log 219using 220.Xr logger 1 , 221and 222.Ic exit 223with an exit value of 224.Ar exitval . 225The error message consists of the script name 226(from 227.Va $0 ) , 228followed by 229.Dq Li ": ERROR: " , 230and then 231.Ar message . 232.It Ic force_depend Ar name 233Output an advisory message and force the 234.Ar name 235service to start. 236The 237.Ar name 238argument is the 239.Xr basename 1 240component of the path to the script, usually 241.Pa /etc/rc.d/name . 242If the script fails for any reason it will output a warning 243and return with a return value of 1. 244If it was successful 245it will return 0. 246.It Ic info Ar message 247Display an informational message to 248.Va stdout , 249and log it to the system log using 250.Xr logger 1 . 251The message consists of the script name 252(from 253.Va $0 ) , 254followed by 255.Dq Li ": INFO: " , 256and then 257.Ar message . 258The display of this informational output can be 259turned on or off by the 260.Xr rc.conf 5 261variable 262.Va rc_info . 263.It Ic load_kld Oo Fl e Ar regex Oc Oo Fl m Ar module Oc Ar file 264Load 265.Ar file 266as a kernel module unless it is already loaded. 267For the purpose of checking the module status, 268either the exact module name can be specified using 269.Fl m , 270or an 271.Xr egrep 1 272regular expression matching the module name can be supplied via 273.Fl e . 274By default, the module is assumed to have the same name as 275.Ar file , 276which is not always the case. 277.It Ic load_rc_config Ar name 278Source in the configuration files for 279.Ar name . 280First, 281.Pa /etc/rc.conf 282is sourced if it has not yet been read in. 283Then, 284.Pa /etc/rc.conf.d/ Ns Ar name 285is sourced if it is an existing file. 286The latter may also contain other variable assignments to override 287.Ic run_rc_command 288arguments defined by the calling script, to provide an easy 289mechanism for an administrator to override the behaviour of a given 290.Xr rc.d 8 291script without requiring the editing of that script. 292.It Ic load_rc_config_var Ar name Ar var 293Read the 294.Xr rc.conf 5 295variable 296.Ar var 297for 298.Ar name 299and set in the current shell, using 300.Ic load_rc_config 301in a sub-shell to prevent unwanted side effects from other variable 302assignments. 303.It Ic mount_critical_filesystems Ar type 304Go through a list of critical file systems, 305as found in the 306.Xr rc.conf 5 307variable 308.Va critical_filesystems_ Ns Ar type , 309mounting each one that 310is not currently mounted. 311.It Ic rc_usage Ar command ... 312Print a usage message for 313.Va $0 , 314with 315.Ar commands 316being the list of valid arguments 317prefixed by 318.Sm off 319.Dq Bq Li fast | force | one | quiet . 320.Sm on 321.It Ic reverse_list Ar item ... 322Print the list of 323.Ar items 324in reverse order. 325.It Ic run_rc_command Ar argument 326Run the 327.Ar argument 328method for the current 329.Xr rc.d 8 330script, based on the settings of various shell variables. 331.Ic run_rc_command 332is extremely flexible, and allows fully functional 333.Xr rc.d 8 334scripts to be implemented in a small amount of shell code. 335.Pp 336.Ar argument 337is searched for in the list of supported commands, which may be one 338of: 339.Bl -tag -width ".Cm restart" -offset indent 340.It Cm start 341Start the service. 342This should check that the service is to be started as specified by 343.Xr rc.conf 5 . 344Also checks if the service is already running and refuses to start if 345it is. 346This latter check is not performed by standard 347.Fx 348scripts if the system is starting directly to multi-user mode, to 349speed up the boot process. 350.It Cm stop 351If the service is to be started as specified by 352.Xr rc.conf 5 , 353stop the service. 354This should check that the service is running and complain if it is not. 355.It Cm restart 356Perform a 357.Cm stop 358then a 359.Cm start . 360Defaults to displaying the process ID of the program (if running). 361.It Cm enabled 362Return 0 if the service is enabled and 1 if it is not. 363This command does not print anything. 364.It Cm rcvar 365Display which 366.Xr rc.conf 5 367variables are used to control the startup of the service (if any). 368.El 369.Pp 370If 371.Va pidfile 372or 373.Va procname 374is set, also support: 375.Bl -tag -width ".Cm restart" -offset indent 376.It Cm poll 377Wait for the command to exit. 378.It Cm status 379Show the status of the process. 380.El 381.Pp 382Other supported commands are listed in the optional variable 383.Va extra_commands . 384.Pp 385.Ar argument 386may have one of the following prefixes which alters its operation: 387.Bl -tag -width ".Li force" -offset indent 388.It Li fast 389Skip the check for an existing running process, 390and sets 391.Va rc_fast Ns = Ns Li YES . 392.It Li force 393Skip the checks for 394.Va rcvar 395being set to 396.Dq Li YES , 397and sets 398.Va rc_force Ns = Ns Li YES . 399This ignores 400.Ar argument Ns Va _precmd 401returning non-zero, and ignores any of the 402.Va required_* 403tests failing, and always returns a zero exit status. 404.It Li one 405Skip the checks for 406.Va rcvar 407being set to 408.Dq Li YES , 409but performs all the other prerequisite tests. 410.It Li quiet 411Inhibits some verbose diagnostics. 412Currently, this includes messages 413.Qq Starting ${name} 414(as checked by 415.Ic check_startmsgs 416inside 417.Nm ) 418and errors about usage of services that are not enabled in 419.Xr rc.conf 5 . 420This prefix also sets 421.Va rc_quiet Ns = Ns Li YES . 422.Em Please, note: 423.Va rc_quiet 424is not intended to completely mask all debug and warning messages, 425but only certain small classes of them. 426.El 427.Pp 428.Ic run_rc_command 429uses the following shell variables to control its behaviour. 430Unless otherwise stated, these are optional. 431.Bl -tag -width ".Va procname" -offset indent 432.It Va name 433The name of this script. 434This is not optional. 435.It Va rcvar 436The value of 437.Va rcvar 438is checked with 439.Ic checkyesno 440to determine if this method should be run. 441.It Va command 442Full path to the command. 443Not required if 444.Ar argument Ns Va _cmd 445is defined for each supported keyword. 446Can be overridden by 447.Va ${name}_program . 448.It Va command_args 449Optional arguments and/or shell directives for 450.Va command . 451.It Va command_interpreter 452.Va command 453is started with: 454.Pp 455.Dl "#! command_interpreter [...]" 456.Pp 457which results in its 458.Xr ps 1 459command being: 460.Pp 461.Dl "command_interpreter [...] command" 462.Pp 463so use that string to find the PID(s) of the running command 464rather than 465.Va command . 466.It Va extra_commands 467Extra commands/keywords/arguments supported. 468.It Va pidfile 469Path to PID file. 470Used to determine the PID(s) of the running command. 471If 472.Va pidfile 473is set, use: 474.Pp 475.Dl "check_pidfile $pidfile $procname" 476.Pp 477to find the PID. 478Otherwise, if 479.Va command 480is set, use: 481.Pp 482.Dl "check_process $procname" 483.Pp 484to find the PID. 485.It Va procname 486Process name to check for. 487Defaults to the value of 488.Va command . 489.It Va required_dirs 490Check for the existence of the listed directories 491before running the 492.Cm start 493method. 494.It Va required_files 495Check for the readability of the listed files 496before running the 497.Cm start 498method. 499.It Va required_modules 500Ensure that the listed kernel modules are loaded 501before running the 502.Cm start 503method. 504This is done after invoking the commands from 505.Va start_precmd 506so that the missing modules are not loaded in vain 507if the preliminary commands indicate a error condition. 508A word in the list can have an optional 509.Dq Li : Ns Ar modname 510or 511.Dq Li ~ Ns Ar pattern 512suffix. 513The 514.Ar modname 515or 516.Ar pattern 517parameter is passed to 518.Ic load_kld 519through a 520.Fl m 521or 522.Fl e 523option, respectively. 524See the description of 525.Ic load_kld 526in this document for details. 527.It Va required_vars 528Perform 529.Ic checkyesno 530on each of the list variables 531before running the 532.Cm start 533method. 534.It Va ${name}_chdir 535Directory to 536.Ic cd 537to before running 538.Va command , 539if 540.Va ${name}_chroot 541is not provided. 542.It Va ${name}_chroot 543Directory to 544.Xr chroot 8 545to before running 546.Va command . 547Only supported after 548.Pa /usr 549is mounted. 550.It Va ${name}_env 551A list of environment variables to run 552.Va command 553with. 554This will be passed as arguments to 555.Xr env 1 556utility. 557.It Va ${name}_fib 558FIB 559.Pa Routing Table 560number to run 561.Va command 562with. 563See 564.Xr setfib 1 565for more details. 566.It Va ${name}_flags 567Arguments to call 568.Va command 569with. 570This is usually set in 571.Xr rc.conf 5 , 572and not in the 573.Xr rc.d 8 574script. 575The environment variable 576.Sq Ev flags 577can be used to override this. 578.It Va ${name}_nice 579.Xr nice 1 580level to run 581.Va command 582as. 583Only supported after 584.Pa /usr 585is mounted. 586.It Va ${name}_oomprotect 587.Xr protect 1 588.Va command 589from being killed when swap space is exhausted. 590If 591.Em YES 592is used, no child processes are protected. 593If 594.Em ALL , 595protect all child processes. 596.It Va ${name}_program 597Full path to the command. 598Overrides 599.Va command 600if both are set, but has no effect if 601.Va command 602is unset. 603As a rule, 604.Va command 605should be set in the script while 606.Va ${name}_program 607should be set in 608.Xr rc.conf 5 . 609.It Va ${name}_user 610User to run 611.Va command 612as, using 613.Xr chroot 8 614if 615.Va ${name}_chroot 616is set, otherwise 617uses 618.Xr su 1 . 619Only supported after 620.Pa /usr 621is mounted. 622.It Va ${name}_group 623Group to run the chrooted 624.Va command 625as. 626.It Va ${name}_groups 627Comma separated list of supplementary groups to run the chrooted 628.Va command 629with. 630.It Va ${name}_prepend 631Commands to be prepended to 632.Va command . 633This is a generic version of 634.Va ${name}_env , 635.Va ${name}_fib , 636or 637.Va ${name}_nice . 638.It Ar argument Ns Va _cmd 639Shell commands which override the default method for 640.Ar argument . 641.It Ar argument Ns Va _precmd 642Shell commands to run just before running 643.Ar argument Ns Va _cmd 644or the default method for 645.Ar argument . 646If this returns a non-zero exit code, the main method is not performed. 647If the default method is being executed, this check is performed after 648the 649.Va required_* 650checks and process (non-)existence checks. 651.It Ar argument Ns Va _postcmd 652Shell commands to run if running 653.Ar argument Ns Va _cmd 654or the default method for 655.Ar argument 656returned a zero exit code. 657.It Va sig_stop 658Signal to send the processes to stop in the default 659.Cm stop 660method. 661Defaults to 662.Dv SIGTERM . 663.It Va sig_reload 664Signal to send the processes to reload in the default 665.Cm reload 666method. 667Defaults to 668.Dv SIGHUP . 669.El 670.Pp 671For a given method 672.Ar argument , 673if 674.Ar argument Ns Va _cmd 675is not defined, then a default method is provided by 676.Ic run_rc_command : 677.Bl -tag -width ".Sy Argument" -offset indent 678.It Sy Argument 679.Sy Default method 680.It Cm start 681If 682.Va command 683is not running and 684.Ic checkyesno Va rcvar 685succeeds, start 686.Va command . 687.It Cm stop 688Determine the PIDs of 689.Va command 690with 691.Ic check_pidfile 692or 693.Ic check_process 694(as appropriate), 695.Ic kill Va sig_stop 696those PIDs, and run 697.Ic wait_for_pids 698on those PIDs. 699.It Cm reload 700Similar to 701.Cm stop , 702except that it uses 703.Va sig_reload 704instead, and does not run 705.Ic wait_for_pids . 706Another difference from 707.Cm stop 708is that 709.Cm reload 710is not provided by default. 711It can be enabled via 712.Va extra_commands 713if appropriate: 714.Pp 715.Dl "extra_commands=reload" 716.It Cm restart 717Runs the 718.Cm stop 719method, then the 720.Cm start 721method. 722.It Cm status 723Show the PID of 724.Va command , 725or some other script specific status operation. 726.It Cm poll 727Wait for 728.Va command 729to exit. 730.It Cm rcvar 731Display which 732.Xr rc.conf 5 733variable is used (if any). 734This method always works, even if the appropriate 735.Xr rc.conf 5 736variable is set to 737.Dq Li NO . 738.El 739.Pp 740The following variables are available to the methods 741(such as 742.Ar argument Ns Va _cmd ) 743as well as after 744.Ic run_rc_command 745has completed: 746.Bl -tag -width ".Va rc_flags" -offset indent 747.It Va rc_arg 748Argument provided to 749.Ic run_rc_command , 750after fast and force processing has been performed. 751.It Va rc_flags 752Flags to start the default command with. 753Defaults to 754.Va ${name}_flags , 755unless overridden by the environment variable 756.Sq Ev flags . 757This variable may be changed by the 758.Ar argument Ns Va _precmd 759method. 760.It Va rc_pid 761PID of 762.Va command 763(if appropriate). 764.It Va rc_fast 765Not empty if 766.Dq Li fast 767prefix was used. 768.It Va rc_force 769Not empty if 770.Dq Li force 771prefix was used. 772.El 773.It Ic run_rc_script Ar file argument 774Start the script 775.Ar file 776with an argument of 777.Ar argument , 778and handle the return value from the script. 779.Pp 780Various shell variables are unset before 781.Ar file 782is started: 783.Bd -ragged -offset indent 784.Va name , 785.Va command , 786.Va command_args , 787.Va command_interpreter , 788.Va extra_commands , 789.Va pidfile , 790.Va rcvar , 791.Va required_dirs , 792.Va required_files , 793.Va required_vars , 794.Ar argument Ns Va _cmd , 795.Ar argument Ns Va _precmd . 796.Ar argument Ns Va _postcmd . 797.Ed 798.Pp 799The startup behaviour of 800.Ar file 801depends upon the following checks: 802.Bl -enum 803.It 804If 805.Ar file 806ends in 807.Pa .sh , 808it is sourced into the current shell. 809.It 810If 811.Ar file 812appears to be a backup or scratch file 813(e.g., with a suffix of 814.Pa ~ , # , .OLD , 815or 816.Pa .orig ) , 817ignore it. 818.It 819If 820.Ar file 821is not executable, ignore it. 822.It 823If the 824.Xr rc.conf 5 825variable 826.Va rc_fast_and_loose 827is empty, 828source 829.Ar file 830in a sub shell, 831otherwise source 832.Ar file 833into the current shell. 834.El 835.It Ic stop_boot Op Ar always 836Prevent booting to multiuser mode. 837If the 838.Va autoboot 839variable is set to 840.Ql yes , 841or 842.Ic checkyesno Ar always 843indicates a truth value, then a 844.Dv SIGTERM 845signal is sent to the parent 846process, which is assumed to be 847.Xr rc 8 . 848Otherwise, the shell exits with a non-zero status. 849.It Ic wait_for_pids Op Ar pid ... 850Wait until all of the provided 851.Ar pids 852do not exist any more, printing the list of outstanding 853.Ar pids 854every two seconds. 855.It Ic warn Ar message 856Display a warning message to 857.Va stderr 858and log it to the system log 859using 860.Xr logger 1 . 861The warning message consists of the script name 862(from 863.Va $0 ) , 864followed by 865.Dq Li ": WARNING: " , 866and then 867.Ar message . 868.El 869.Sh FILES 870.Bl -tag -width ".Pa /etc/rc.subr" -compact 871.It Pa /etc/rc.subr 872The 873.Nm 874file resides in 875.Pa /etc . 876.El 877.Sh SEE ALSO 878.Xr rc.conf 5 , 879.Xr rc 8 880.Sh HISTORY 881The 882.Nm 883script 884appeared in 885.Nx 1.3 . 886The 887.Xr rc.d 8 888support functions appeared in 889.Nx 1.5 . 890The 891.Nm 892script 893first appeared in 894.Fx 5.0 . 895