FreeBSD-init

From wikinotes

The FreeBSD init system is called rc.

Documentation

official tutorial https://docs.freebsd.org/en/articles/rc-scripting/#rcng-dummy
man rc.subr https://www.freebsd.org/cgi/man.cgi?query=rc.subr
man rc https://www.freebsd.org/cgi/man.cgi?query=rc
man rcorder https://www.freebsd.org/cgi/man.cgi?query=rcorder

Locations

/etc/rc.d/* system rc scripts
/usr/local/etc/rc.d/* user rc scripts
/etc/rc.subr available rc script methods

Notes

freebsd rc usage
freebsd rc syntax
freebsd rc troubleshooting

Init Scripting

NOTE:

Checkout the following initscripts (in my saltstack repostiory) for simple examples:

  • taskwarrior's taskd
  • minecraft
https://www.freebsd.org/doc/en/articles/rc-scripting/rcng-dummy.html Official Documentation
/etc/rc.subr Library of rc-script functions

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

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"