A Minimal FreeBSD rc.d Script

FreeBSDInit
#!/bin/sh

# PROVIDE: YOUR_SERVICE_NAME
# REQUIRE: LOGIN DAEMON NETWORKING

. /etc/rc.subr

name=YOUR_SERVICE_NAME
rcvar=YOUR_SERVICE_NAME_enable
start_cmd="YOUR_SERVICE_NAME_start"
stop_cmd="YOUR_SERVICE_NAME_stop"

YOUR_SERVICE_NAME_start() 
{
	daemon \
		-r \
		-p /tmp/YOUR_SERVICE_NAME_child_pid \
		-P /tmp/YOUR_SERVICE_NAME_supervisor_pid \
		-o /var/log/YOUR_SERVICE_NAME \
		YOUR_COMMAND
}

YOUR_SERVICE_NAME_stop()
{
	if [ -f /tmp/YOUR_SERVICE_NAME_supervisor_pid ] ; then
		cat /tmp/YOUR_SERVICE_NAME_supervisor_pid | xargs kill -9 
		rm /tmp/YOUR_SERVICE_NAME_supervisor_pid
	fi
	if [ -f /tmp/YOUR_SERVICE_NAME_child_pid ] ; then
		cat /tmp/YOUR_SERVICE_NAME_child_pid | xargs kill -9 
		rm /tmp/YOUR_SERVICE_NAME_child_pid
	fi
}

load_rc_config $name
run_rc_command "$1"

What does this script do? Well…

$ service YOUR_SERVICE_NAME start will start a daemon that will then manage YOUR_COMMAND. I suggest you read the man page for daemon. In short, -r will reload run YOUR_COMMAND again, one second after the command has been terminated. This is helpful if YOUR_COMMAND begins a web server that may unexpectedly fail. -p and -P are used to stop and restart the service. Both the daemon process and the YOUR_COMMAND process must be stopped at some point in time. kill -9 is used in conjunction with the child and supervisor PID to accomplish this. -o will redirect your commands output to a log file (placed in /var/log/ in this example).

$ service YOUR_SERVICE stop will, well, stop the service.

Please note, the child and supervisor PID are placed into the /tmp/ directory in this example. You probably don’t want it placed there (as other $USER could read).

A file like this should be placed in the /usr/local/etc/rc.d/ directory. The service is first started with $ service YOUR_SERVICE_NAME onestart. If it was started successfully, you may want to enable it at boot with $ service YOUR_SERVICE_NAME enable. Once the service has been enabled $ service YOUR_SERVICE_NAME {start|stop|restart} become available.

I suggest you read more here: Practical rc.d scripting in BSD.

Next
CI/CD! Who Needs ‘Em?

Prev
This Is A Standard Go Project Layout