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