I stumbled into an annoying problem
yesterday when setting up Onion
Services for the Gopher site(s) I operate on a FreeBSD machine: two different
rc.d
scripts were conflicting.
Since Gopher has no ability to consider “virtual hosts” the way an HTTP server might, I resolved to just run two different invocation of the same daemon with slightly different parameters. This blog post isn’t about Gopher however, but about getting FreeBSD to run two very similar daemons.
In my first attempt, somehow FreeBSD believed both scripts to be running the same exact process, for example:
% service gopheronion status
gopheronion is running as pid 39023.
% service gopher status
gopher is running as pid 39023.
My rc.d
scripts were basically a copy of the Startup and shutdown of a
simple
daemon
section of the handbook:
#!/bin/sh
. /etc/rc.subr
name="gopher
command="usr/sbin/daemon"
command_args="a bunch of args for the gopher server"
load_rc_config $name
run_rc_command "$1"
The two scripts were identical except for command_args
, and somehow both
could not run at the same time! I tried changing the names, changing the ordering, and even rewrote the scripts over again just to be safe.
Nothing.
Then I finally broke down and started reading some documentation.
Deep in the rc.subr(8)
manpage I noticed this note for the run_rc_command
function:
procname Process name to check for. Defaults to the
value of command.
Aha! Both scripts had the same command
(/usr/sbin/daemon
), so the machinery
inside of run_rc_command
was considering them to basically be running the
same process! Adding a different procname
declaration to each file solved the problem, and voila! Both services were up and running!
# ...
name="gopher
procname="gopher"
command="usr/sbin/daemon"
command_args="a bunch of args for the gopher server"
# ...