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.
rc.d scripts were basically a copy of the Startup and shutdown of a
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.
Then I finally broke down and started reading some documentation.
Deep in the
rc.subr(8) manpage I noticed this note for the
procname Process name to check for. Defaults to the value of command.
Aha! Both scripts had the same
/usr/sbin/daemon), so the machinery
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" # ...