rcスクリプトで自動起動

例によって例のごとく、FreeBSD上でサービスを動かしていると、サーバなどでは再起動時に自動で実行してくれていたら便利だなと思うことが多々あります。
とりあえず、/etc/rc.local に追加することで、起動時の自動実行という目的は達成できるのですが、起動の順番を指定することができないので、
あるサービスが動いていることが前提で、それに依存するサービスを動かす、みたいなちょっと複雑なシステムの起動にはうまく行かなかったりします。

そこで、/usr/local/etc/rc.d/以下にrcスクリプトをおいて、その辺の調停もうまい具合にこなしつつ自動で実行させる方法について説明します。

以下の説明で OS は FreeBSD 12.3-RELEASE ですが、13移行でもそれほど変わりはないと思います。

まず、参考にしたのは
Practical rc.d scripting in BSD
https://docs.freebsd.org/en/articles/rc-scripting/

man rc.subr
https://www.freebsd.org/cgi/man.cgi?rc.subr(8)
です。
ここを読めば基本的なことは書いてありますので、ここに乗っている dummy rc スクリプトをベースに起動するサービスにあったように修正していきます。

最小限のファイルはこんな感じです。chmod +x して実行可能属性を追加しておいてください。

----ここから-----
#!/bin/sh

# PROVIDE: hoge

. /etc/rc.subr

name="hoge"
hoge_user="www"

load_rc_config $name
: ${hoge_enable:="No"}
: ${hoge_root:="/usr/local/www/hoge/"}
: ${pidfile:="/var/run/${name}/${name}.pid"}

command="/usr/sbin/daemon"
command_args="-P ${pidfile} -r -f /usr/local/bin/php -S hoge.bamboogate.co.jp:80 -t ${hoge_root} ${hoge_root}index.php"

load_rc_config $name
run_rc_command "$1"
-----ここまで-----

あとは /etc/rc.conf に hoge_enable="YES" を追加しておきます。

# sysrc hoge_enable="YES"

また、サービスのrootディレクトリを別の場所で実行したい場合は
# sysrc hoge_root="/home/hoge/work/"
などと指定することもできます。

service -e で確認して、自動的に起動されることを確認します。

あとは起動順序の調整ですが、以下のコマンドで確認します。

# rcorder {,/usr/local}/etc/rc.d/*

たとえば、ネットワークが使えるようになってから起動したいばあい、下記を
rcファイルに追加します。

# REQUEST NETWORKING

サービス foo が実行されているあとに、このサービスを実行したいばあい、
# REQUEST foo

のようにしておけば、起動順序を確認した際に、foo のあとに hoge が並ぶようになります。

あとは最終的にサーバを再起動して、自動的に実行されていることを確認しましょう。