Freebsd rc syntax

From wikinotes

Documentation

official docs https://www.freebsd.org/doc/en/articles/rc-scripting/rcng-dummy.html

Locations

/etc/rc.subr Library of rc-script functions


Example

Simple Annotated Skeleton file

#!/bin/sh

# PROVIDE: myservice                   # allows other services to require 'myservice'
# REQUIRE: DAEMON                      # before this service starts, DAEMON must be provided
# KEYWORD: shutdown                    # this service must be killed before the system shuts down

. /etc/rc.subr                         # source rc.subr, generic rc-script functions
# General Commands

name="myservice"                        # mandatory unique-name for script
rcvar="myservice_enable"                # name of variable in /etc/rc.conf used to enable service
# Read User-Configuration in /etc/rc.conf
# Set Variables that can be used in rc.conf

load_rc_config $name                             # load variables from /etc/rc.conf

: ${myservice_enable:=NO}                       # rc.conf variables, and their defaults
: ${myservice_config=/etc/myservice.conf}
: ${myservice_user=will}
# Environment Variables
${name}_env="VAR=value VAR2=value" # you can set environment variables for the command this way
# Builtin Variables thave affect CLI command to be run
${name}_user=myuser                                    # user to run command as (using su)
pidfile=/var/run/myservice/myservice.pid                # pidfile path
command=/usr/local/bin/myservice                       # path to binary
command_args="-d -p ${pidfile}"                         # arguments to use against $command
command_interpreter=/usr/local/bin/python2.7           # use different interpreter than /bin/sh
# Other Builtin Variables

# Command is not run if files do not exist
required_files="/etc/${name}.conf /usr/share/misc/${name}.rules"
# Start/Stop/Restart/... Functions

start_cmd="${name}_start"            # override default /etc/rc.subr start function with the function ${name}_start
stop_cmd=":"                         # use default /etc/rc.subr stop_cmd function

start_precmd="echo start"            # runs before 'start'
start_postcmd="echo end"             # runs after successful 'start'

dummy_start()                        # define your own functions
{
    echo "Nothing started."
}
# run Command

run_rc_command "$1"                   # based on above conts, run command using /etc/rc.subr function

Debugging

You can create 'debug mode' for a particular init script by adding the following lines to it's init script (just below the shebang), then rebooting and checking /tmp/output.txt.

set -xv
exec 1>/tmp/output.txt 2>&1

Dependencies

rcscripts use special comments to indicate requirements, and ordering.
Multiple values can be assigned, they are space-separated.

# PROVIDE: grafana
# REQUIRE: login prometheus

Daemonize Non-Daemon Programs

FreeBSD provides the program daemon which manages forking processes along with their pidfile. Simply use this as your command instead. Note that you will need to manage your status/stop manually if running the program this way.

pidfile=/var/run/program_name.pid

is_running(){
    if [ -f $pidfile ]; then
        pgrep `cat $pidfile`
        return $0
    fi

    return 1
}

program_status(){
    if is_running; then
        echo "${name} is running"
    else
        echo "${name} is not running"
    fi
}

program_stop() {
    if is_running; then
        echo "stopping ${name}"
        kill -15 `cat pidfile`
    else
        echo "${name} is not running"
    fi
}


status_cmd=program_status
stop_cmd=program_stop

command="/usr/sbin/daemon"
command_args="-u $command_user -f -p $pidfile    $program_name -x -y -z"