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 November 7, 2018 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. 494The list is checked before running 495.Va start_precmd . 496.It Va required_files 497Check for the readability of the listed files 498before running the 499.Cm start 500method. 501The list is checked before running 502.Va start_precmd . 503.It Va required_modules 504Ensure that the listed kernel modules are loaded 505before running the 506.Cm start 507method. 508The list is checked after running 509.Va start_precmd . 510This is done after invoking the commands from 511.Va start_precmd 512so that the missing modules are not loaded in vain 513if the preliminary commands indicate a error condition. 514A word in the list can have an optional 515.Dq Li \&: Ns Ar modname 516or 517.Dq Li ~ Ns Ar pattern 518suffix. 519The 520.Ar modname 521or 522.Ar pattern 523parameter is passed to 524.Ic load_kld 525through a 526.Fl m 527or 528.Fl e 529option, respectively. 530See the description of 531.Ic load_kld 532in this document for details. 533.It Va required_vars 534Perform 535.Ic checkyesno 536on each of the list variables 537before running the 538.Cm start 539method. 540The list is checked after running 541.Va start_precmd . 542.It Va ${name}_chdir 543Directory to 544.Ic cd 545to before running 546.Va command , 547if 548.Va ${name}_chroot 549is not provided. 550.It Va ${name}_chroot 551Directory to 552.Xr chroot 8 553to before running 554.Va command . 555Only supported after 556.Pa /usr 557is mounted. 558.It Va ${name}_env 559A list of environment variables to run 560.Va command 561with. 562This will be passed as arguments to the 563.Xr env 1 564utility. 565.It Va ${name}_env_file 566A file to source for environmental variables to run 567.Va command 568with. 569Note that all the variables which are being assigned in this file are going 570to be exported into the environment of 571.Va command . 572.It Va ${name}_fib 573FIB 574.Pa Routing Table 575number to run 576.Va command 577with. 578See 579.Xr setfib 1 580for more details. 581.It Va ${name}_flags 582Arguments to call 583.Va command 584with. 585This is usually set in 586.Xr rc.conf 5 , 587and not in the 588.Xr rc.d 8 589script. 590The environment variable 591.Sq Ev flags 592can be used to override this. 593.It Va ${name}_nice 594.Xr nice 1 595level to run 596.Va command 597as. 598Only supported after 599.Pa /usr 600is mounted. 601.It Va ${name}_limits 602Resource limits to apply to 603.Va command . 604This will be passed as arguments to the 605.Xr limits 1 606utility. 607By default, the resource limits are based on the login class defined in 608.Va ${name}_login_class . 609.It Va ${name}_login_class 610Login class to use with 611.Va ${name}_limits . 612Defaults to 613.Dq Li daemon . 614.It Va ${name}_oomprotect 615.Xr protect 1 616.Va command 617from being killed when swap space is exhausted. 618If 619.Dq Li YES 620is used, no child processes are protected. 621If 622.Dq Li ALL , 623protect all child processes. 624.It Va ${name}_program 625Full path to the command. 626Overrides 627.Va command 628if both are set, but has no effect if 629.Va command 630is unset. 631As a rule, 632.Va command 633should be set in the script while 634.Va ${name}_program 635should be set in 636.Xr rc.conf 5 . 637.It Va ${name}_user 638User to run 639.Va command 640as, using 641.Xr chroot 8 642if 643.Va ${name}_chroot 644is set, otherwise 645uses 646.Xr su 1 . 647Only supported after 648.Pa /usr 649is mounted. 650.It Va ${name}_group 651Group to run the chrooted 652.Va command 653as. 654.It Va ${name}_groups 655Comma separated list of supplementary groups to run the chrooted 656.Va command 657with. 658.It Va ${name}_prepend 659Commands to be prepended to 660.Va command . 661This is a generic version of 662.Va ${name}_env , 663.Va ${name}_fib , 664or 665.Va ${name}_nice . 666.It Ar argument Ns Va _cmd 667Shell commands which override the default method for 668.Ar argument . 669.It Ar argument Ns Va _precmd 670Shell commands to run just before running 671.Ar argument Ns Va _cmd 672or the default method for 673.Ar argument . 674If this returns a non-zero exit code, the main method is not performed. 675If the default method is being executed, this check is performed after 676the 677.Va required_* 678checks and process (non-)existence checks. 679.It Ar argument Ns Va _postcmd 680Shell commands to run if running 681.Ar argument Ns Va _cmd 682or the default method for 683.Ar argument 684returned a zero exit code. 685.It Va sig_stop 686Signal to send the processes to stop in the default 687.Cm stop 688method. 689Defaults to 690.Dv SIGTERM . 691.It Va sig_reload 692Signal to send the processes to reload in the default 693.Cm reload 694method. 695Defaults to 696.Dv SIGHUP . 697.El 698.Pp 699For a given method 700.Ar argument , 701if 702.Ar argument Ns Va _cmd 703is not defined, then a default method is provided by 704.Ic run_rc_command : 705.Bl -tag -width ".Sy Argument" -offset indent 706.It Sy Argument 707.Sy Default method 708.It Cm start 709If 710.Va command 711is not running and 712.Ic checkyesno Va rcvar 713succeeds, start 714.Va command . 715.It Cm stop 716Determine the PIDs of 717.Va command 718with 719.Ic check_pidfile 720or 721.Ic check_process 722(as appropriate), 723.Ic kill Va sig_stop 724those PIDs, and run 725.Ic wait_for_pids 726on those PIDs. 727.It Cm reload 728Similar to 729.Cm stop , 730except that it uses 731.Va sig_reload 732instead, and does not run 733.Ic wait_for_pids . 734Another difference from 735.Cm stop 736is that 737.Cm reload 738is not provided by default. 739It can be enabled via 740.Va extra_commands 741if appropriate: 742.Pp 743.Dl "extra_commands=reload" 744.It Cm restart 745Runs the 746.Cm stop 747method, then the 748.Cm start 749method. 750.It Cm status 751Show the PID of 752.Va command , 753or some other script specific status operation. 754.It Cm poll 755Wait for 756.Va command 757to exit. 758.It Cm rcvar 759Display which 760.Xr rc.conf 5 761variable is used (if any). 762This method always works, even if the appropriate 763.Xr rc.conf 5 764variable is set to 765.Dq Li NO . 766.El 767.Pp 768The following variables are available to the methods 769(such as 770.Ar argument Ns Va _cmd ) 771as well as after 772.Ic run_rc_command 773has completed: 774.Bl -tag -width ".Va rc_flags" -offset indent 775.It Va rc_arg 776Argument provided to 777.Ic run_rc_command , 778after fast and force processing has been performed. 779.It Va rc_flags 780Flags to start the default command with. 781Defaults to 782.Va ${name}_flags , 783unless overridden by the environment variable 784.Sq Ev flags . 785This variable may be changed by the 786.Ar argument Ns Va _precmd 787method. 788.It Va rc_pid 789PID of 790.Va command 791(if appropriate). 792.It Va rc_fast 793Not empty if 794.Dq Li fast 795prefix was used. 796.It Va rc_force 797Not empty if 798.Dq Li force 799prefix was used. 800.El 801.It Ic run_rc_script Ar file argument 802Start the script 803.Ar file 804with an argument of 805.Ar argument , 806and handle the return value from the script. 807.Pp 808Various shell variables are unset before 809.Ar file 810is started: 811.Bd -ragged -offset indent 812.Va name , 813.Va command , 814.Va command_args , 815.Va command_interpreter , 816.Va extra_commands , 817.Va pidfile , 818.Va rcvar , 819.Va required_dirs , 820.Va required_files , 821.Va required_vars , 822.Ar argument Ns Va _cmd , 823.Ar argument Ns Va _precmd . 824.Ar argument Ns Va _postcmd . 825.Ed 826.Pp 827The startup behaviour of 828.Ar file 829depends upon the following checks: 830.Bl -enum 831.It 832If 833.Ar file 834ends in 835.Pa .sh , 836it is sourced into the current shell. 837.It 838If 839.Ar file 840appears to be a backup or scratch file 841(e.g., with a suffix of 842.Pa ~ , # , .OLD , 843or 844.Pa .orig ) , 845ignore it. 846.It 847If 848.Ar file 849is not executable, ignore it. 850.It 851If the 852.Xr rc.conf 5 853variable 854.Va rc_fast_and_loose 855is empty, 856source 857.Ar file 858in a sub shell, 859otherwise source 860.Ar file 861into the current shell. 862.El 863.It Ic stop_boot Op Ar always 864Prevent booting to multiuser mode. 865If the 866.Va autoboot 867variable is set to 868.Ql yes , 869or 870.Ic checkyesno Ar always 871indicates a truth value, then a 872.Dv SIGTERM 873signal is sent to the parent 874process, which is assumed to be 875.Xr rc 8 . 876Otherwise, the shell exits with a non-zero status. 877.It Ic wait_for_pids Op Ar pid ... 878Wait until all of the provided 879.Ar pids 880do not exist any more, printing the list of outstanding 881.Ar pids 882every two seconds. 883.It Ic warn Ar message 884Display a warning message to 885.Va stderr 886and log it to the system log 887using 888.Xr logger 1 . 889The warning message consists of the script name 890(from 891.Va $0 ) , 892followed by 893.Dq Li ": WARNING: " , 894and then 895.Ar message . 896.El 897.Sh FILES 898.Bl -tag -width ".Pa /etc/rc.subr" -compact 899.It Pa /etc/rc.subr 900The 901.Nm 902file resides in 903.Pa /etc . 904.El 905.Sh SEE ALSO 906.Xr rc.conf 5 , 907.Xr rc 8 908.Sh HISTORY 909The 910.Nm 911script 912appeared in 913.Nx 1.3 . 914The 915.Xr rc.d 8 916support functions appeared in 917.Nx 1.5 . 918The 919.Nm 920script 921first appeared in 922.Fx 5.0 . 923