EN JA
RC.SUBR(8)
RC.SUBR(8) FreeBSD System Manager's Manual RC.SUBR(8)

名称

rc.subrシステムシェルスクリプトで使用する関数群

書式

  • . /etc/rc.subr

  • backup_file action file current backup
  • checkyesno var
  • check_pidfile pidfile procname [ interpreter]
  • check_process procname [ interpreter]
  • debug message
  • err exitval message
  • force_depend name
  • info message
  • load_kld [ -e regex][ -m module] file
  • load_rc_config name
  • load_rc_config_var name var
  • mount_critical_filesystems type
  • rc_usage command ...
  • reverse_list item ...
  • run_rc_command argument
  • run_rc_script file argument
  • wait_for_pids [ pid ...]
  • warn message

解説

rc.subr スクリプトは、 rc(8) のような様々なスクリプトから共通に利用されるシェルスクリプト関数や変数定義を含んでいます。また ports が要求する /usr/local/etc/rc.d 内のスクリプトも、やがては本スクリプトを使用するように書き換えられるでしょう。

rc.subr の関数群は、大部分が NetBSD から取り込まれたものです。

それらは、カレントシェルに /etc/rc.subr を読み込むことによってアクセルされます。

次のシェル関数が利用可能です:

backup_file action file current backup
file のバックアップコピーを current として作成します。 rc.conf(5) 変数の backup_uses_rcs が“ YES”である場合、以前のバージョンの currentrcs(1) を使ってアーカイブします。そうでない場合の、以前のバージョンの currentbackup として保存します。

引数 action は次のうちのどれかです:

add
file はこのバックアップ機構により今後バックアップされるようになるか、あるいは再度追加されます。 current が作成され、必要なら、 rcs(1) ファイルが同様に作成されます。
update
file は変更されており、バックアップを取る必要があります。 current が存在するなら、 backup にコピーされるか、もしくは rcs(1) にチェックインされます (リポジトリファイルが古い場合)。その後に、 filecurrent にコピーされます。
remove
file はこのバックアップ機構で管理されなくなります。 rcs(1) が使われている場合は、空のファイルがチェックインされて current は削除されます。そうでない場合は、 currentbackup に移動します。
checkyesno var
var の値が“ YES”, “ TRUE”, “ ON”, ‘ 1’ならば、0 を返します。 var の値が“ NO”, “ FALSE”, “ OFF”, ‘ 0’ならば、1 を返します。これら以外の値ならば、 var が正しく設定されていないという警告を出します。値は、大文字と小文字を区別しません。 : var は、値ではなく、変数名であるべきです。 checkyesno は、それ自体によって変数を拡張します。
check_pidfile pidfile procname [ interpreter]
pidfile の最初の行の最初の語を解析して PID とし、この PID を持つプロセスが実行されていて、最初の引数が procname にマッチすることを確認します。成功すればマッチした PID を出力し、そうでない場合は何もしません。 interpreter が提供されるなら、 procname の最初の行を解析して、行が次の形式であることを確実にします:

#! interpreter [...]

そして interpreter とオプション引数に procname を追加したものを、検索するプロセス文字列として使用します。

check_process procname [ interpreter]
最初の引数が procname にマッチする、実行されているすべてのプロセスの PID を出力します。 interpretercheck_pidfile と同様に扱われます。
debug message
デバッグメッセージを stderr に表示し、 logger(1) を使用してシステムログに記録をして、呼び出し元に戻ります。このエラーメッセージは、スクリプト名 ( $0 より), “ : DEBUG: ”, およびこれに続く message で構成されます。この関数はスクリプトのデバッグの手助けとして、開発者が使用することを目的にしています。これは rc.conf(5) 変数の rc_debug により、有効あるいは無効にすることができます。
err exitval message
エラーメッセージを stderr に表示し、 logger(1) を使用してシステムログに記録をして、終了値 exitval終了 します。このエラーメッセージは、スクリプト名 ( $0 より), “ : ERROR: ”, およびこれに続く message で構成されます。
force_depend name
勧告メッセージを出力し、 name サービスを強制的に起動します。引数 name は、通常 /etc/rc.d/name といったスクリプトのパスの basename(1) 要素です。スクリプトが何らかの原因で失敗した場合、警告を出力して戻り値 1 を返します。成功した場合は、戻り値 0 を返します。
info message
情報メッセージを stdout に表示し、 logger(1) を使用してシステムログに記録をします。このメッセージは、スクリプト名 ( $0 より), “ : INFO: ”, およびこれに続く message で構成されます。この情報出力の表示は rc.conf(5) 変数の rc_info により、有効あるいは無効にすることができます。
load_kld [ -e regex][ -m module] file
file が既にロードされていないなら、カーネルモジュールとして、それをロードします。モジュール状態をチェックする目的として、 -m または -e を通して提供することができるモジュール名と適合する egrep(1) 正規表現を使用して、正確なモジュール名を指定することができます。デフォルトでは、モジュールには、いつものことではなく、 file として同じ名前があると仮定されます。
load_rc_config name
name の設定ファイルを読み込みます。最初に、 /etc/rc.conf がまだ読み込まれていなければ、読み込みます。その後に、ファイル /etc/rc.conf.d/ name が存在すれば、これを読み込みます。後者は呼び出しスクリプト側で指定した run_rc_command 引数を上書きする変数定義を含めることもできます。これは管理者が任意の rc.d(8) スクリプトを編集することなく、その動作を上書きできる簡易な仕組みを提供します。
load_rc_config_var name var
name のために rc.conf(5) 変数の var を読み込み、他の変数代入から不要な副作用を防ぐために、サブシェルで load_rc_config を使用して、現在のシェルに設定します。
mount_critical_filesystems type
rc.conf(5) 変数の critical_filesystems_ type で定義された重要なファイルシステムの一覧のうち、この時点でマウントされていないものがあれば、マウントします。
rc_usage command ...
$0 の使用方法を、有効な引数の一覧である command に“[ fast| force| one| quiet]”のプレフィックスをつけて出力します。
reverse_list item ...
item のリストを逆順で出力します。
run_rc_command argument
各種のシェル変数の設定に基づいて、現在の rc.d(8) スクリプトの、 argument 処理を実行します。 run_rc_command はきわめて柔軟性があり、完全に機能する rc.d(8) スクリプトを小量のシェルコードで記述することができます。

argument はサポートされているコマンドから検索され、それは以下のうちのどれかです:

start
サービスを起動します。本コマンドは、 rc.conf(5) の指定によりサービスを起動するべきかをチェックします。またサービスが既に実行中であるかをチェックし、その場合は起動を拒否します。標準の FreeBSD スクリプトにおいて、システムが直接マルチユーザモードで起動する場合は、起動プロセスの高速化のために、後者のチェックは行われません。
stop
rc.conf(5) の指定によりサービスが起動していれば、サービスを停止します。本コマンドはサービスが実行中かどうかをチェックし、そうでない場合、その旨を表示します。
restart
stop の後に、 start を実行します。デフォルトでは、(もし実行中なら) プログラムのプロセス ID を表示します。
enabled
サービスが有効にされるなら、0 を返し、それがそうでないなら、1 を返します。このコマンドは、何も印刷 (表示) しません。
rcvar
どの rc.conf(5) 変数がサービスの起動を制御しているか、(もしあれば) 表示します。

pidfile または procname が設定されていれば、以下もサポートされています:

poll
コマンドが終了するのを待ちます。
status
プロセスの状態を表示します。

他にサポートされているコマンドは、オプション変数の extra_commands に列挙されています。

argument はそれ自身の動作を変更する、以下のプレフィックスをつけることができます:

fast
実行中のプロセスの有無をチェックしません。 rc_fast= YES をセットします。
force
rcvar が“ YES”にセットされているかどうかをチェックしません。 rc_force= YES をセットします。 argument _precmd が非 0 を返したり、 required_* テストのどれかが失敗したりしても無視します。また終了ステータスとして常に 0 を返します。
one
rcvar が“ YES”にセットされているかどうかをチェックしません。しかし他の全ての前提チェックは行います。
quiet
いくつかの冗長な診断を抑制します。現在、これは、 ( rc.subr の内部の check_startmsgs によってチェックされる) メッセージ“Starting ${name}”と rc.conf(5) で有効にされないサービスの使用法に関するエラーを含みます。また、この接頭辞は、 rc_quiet= YES を設定します。 次を注意してください: rc_quiet は、すべてのデバッグと警告メッセージを完全に隠すことを目的としていませんが、それらの特定の小さなクラスだけ隠します。

run_rc_command はその動作を制御するために、以下のシェル変数を使用します。特に明記が無いものは、オプションです。

name
このスクリプトの名称。これはオプションではありません。
rcvar
rcvar の値は checkyesno によりチェックされ、この処理を実行するかどうかを判定します。
command
コマンドのフルパス。サポートされている各キーワードに対して argument _cmd が設定されている場合は、必要ありません。 ${name}_program によって上書きすることができます。
command_args
オプション引数、および / または command に対するシェルディレクティブ。
command_interpreter
command は、次の形式で始まります:

#! command_interpreter [...]

ps(1) コマンドの出力は次のようになります:

command_interpreter [...] command

ですので、実行中のコマンドの PID を検索するのに、 command ではなくこの文字列を使用します。

extra_commands
特別にサポートするコマンド / キーワード / 引数。
pidfile
PID ファイルのパス。実行中のコマンドの PID を特定するのに使用します。 pidfile が設定された場合、次を使用します:

check_pidfile $pidfile $procname

そうでなければ、 command が設定されている場合、次を使用します:

check_process $procname
procname
チェックする対象プロセス名。デフォルトでは command の値です。
required_dirs
start 処理を実行する前に、これに列挙された各ディレクトリの存在をチェックします。
required_files
start 処理を実行する前に、これに列挙された各ファイルが読み込み可能かどうかをチェックします。
required_modules
start 処理を実行する前に、リストされたカーネルモジュールがロードされることを確実にします。予備のコマンドがエラー条件を示すなら、不足しているモジュールが無駄にロードされないように、 start_precmd からコマンドを呼び出した後に、これが行われます。リスト中の単語は、オプションの“ : modname”または“ ~ pattern”接尾辞を持つことができます。 modname または pattern パラメータは、それぞれ -m または -e オプションを通して load_kld に渡されます。詳細については、本文書の load_kld の説明を参照してください。
required_vars
start 処理を実行する前に、これに列挙された各変数に対して checkyesno を適用します。
${name}_chdir
${name}_chroot が提供されない場合、 command を実行する前に cd するディレクトリ。
${name}_chroot
command を実行する前に chroot(8) するディレクトリ。 /usr がマウントされた後にのみサポートされています。
${name}_flags
command の呼び出し時に適用する引数。これは通常 rc.conf(5) で設定され、 rc.d(8) スクリプトで設定されるものではありません。これを上書きするのに、環境変数の‘ flags’を使うことができます。
${name}_nice
command を実行する際の nice(1) レベル。 /usr がマウントされた後にのみサポートされています。
${name}_program
コマンドへのフルパス。両方が設定されるなら、 command を上書きしますが、 command が設定されていなければ、効果はありません。通常、 ${name}_program は、 rc.conf(5) に設定されるべきですが、 command は、スクリプトに設定されるべきです。
${name}_user
${name}_chroot が設定されているなら、 chroot(8) を使用して、ユーザは、 command を実行し、そうでなければ、 su(1) を使用します。 /usr がマウントされた後にのみサポートされています。
${name}_group
chroot 後に command を実行する際のグループ。
${name}_groups
コンマで区切られたリストで、chroot 後に command を実行する際の補助グループ。
argument _cmd
argument のデフォルト処理を上書きするシェルコマンド。
argument _precmd
argument _cmd を実行する直前、もしくは argument のデフォルト処理の直前に実行するシェルコマンド。もしこれが非 0 の終了コードを返した場合、メイン処理は行われません。デフォルト処理が実行されるならば、このチェックは required_* チェックとプロセスの (非) 存在チェックの後に行われます。
argument _postcmd
実行された argument _cmd、もしくは argument のデフォルト処理が終了コード 0 を返した時に実行されるシェルコマンド。
sig_stop
デフォルトの stop 処理において、プロセスを停止するのに送られるシグナル。デフォルトは SIGTERM です。
sig_reload
デフォルトの reload 処理において、プロセスに再読み込みさせるのに送られるシグナル。デフォルトは SIGHUP です。

argument で与えられた処理に対して、 argument_cmd が定義されていなければ、デフォルト処理が run_rc_command によって与えられます:

argument
デフォルト処理
start
command が実行されておらず、 checkyesno rcvar が成功すれば、 command を起動します。
stop
check_pidfile または check_process (適切なほう) により command の PID を特定し、それらの PID に対して kill sig_stop を実行し、そしてそれらの PID に対して wait_for_pids を実行します。
reload
stop と似ていますが、違うのは代わりに sig_reload を使い、 wait_for_pids を実行しないことです。 stop との他の違いは、 reload は、デフォルトでは提供されないことです。適切であるなら、 extra_commands によって有効にすることができます:

extra_commands=reload
restart
stop 処理を実行後に、 start 処理を実行します。
status
command の PID を表示するか、もしくはスクリプト固有のステータス情報を表示します。
poll
command が終了するのを待ちます。
rcvar
使用される rc.conf(5) 変数を (もしあれば) 表示します。この処理は、対応する rc.conf(5) 変数が“ NO”に設定されていても動作します。

以下の変数は、 run_rc_command が完了した後だけでなく、 ( argument_cmd のような) 処理でも同様に参照できます:

rc_arg
fast 及び force 処理が済んだ後の、 run_rc_command に与えられた引数。
rc_flags
デフォルトのコマンド実行時のフラグ。環境変数の‘ flags’で上書きされない限り、デフォルトは ${name}_flags です。この変数は argument _precmd 処理で変更することができます。
rc_pid
command の PID (もしあるならば)。
rc_fast
fast”プレフィックスが使われた場合、空ではありません。
rc_force
force”プレフィックスが使われた場合、空ではありません。
run_rc_script file argument
スクリプト file を引数 argument で実行し、スクリプトからの戻り値を処理します。

file が実行される前に、多くのシェル変数が消去されます:

name, command, command_args, command_interpreter, extra_commands, pidfile, rcvar, required_dirs, required_files, required_vars, argument _cmd, argument _precmd. argument _postcmd.

file 起動時の動作は、以下のチェックに依るものになります:

  1. file の名前が .sh で終わっていれば、カレントシェルに読み込まれます。
  2. file がバックアップもしくは一時ファイルのようならば (例、サフィックスが ~, #, .OLD または .orig である)、無視します。
  3. file が実行可能でなければ、無視します。
  4. rc.conf(5) 変数の rc_fast_and_loose が空ならば、 file をサブシェルで読み込みます。そうでなければ、カレントシェルで file を読み込みます。
stop_boot [ always]
マルチユーザモードになるブートを防ぎます。 autoboot 変数が、‘ yes’に設定されるか、または checkyesno が、 常に 真の値を示すなら、 SIGTERM シグナルは、 rc(8) となると仮定される、親のプロセスに送られます。そうでなければ、シェルは、0 以外のステータスで終了します。
wait_for_pids [ pid ...]
指定された全ての pid が消失するまで待ち、2 秒ごとに残存している pid を出力します。
warn message
警告メッセージを stderr に表示し、 logger(1) を使用してシステムログに記録をします。この警告メッセージは、スクリプト名 ( $0 より), “ : WARNING: ”, およびこれに続く message で構成されます。

関連ファイル

/etc/rc.subr
rc.subr ファイルは、 /etc に存在します。

関連項目

rc.conf(5), rc(8)

歴史

rc.subr スクリプトは、 NetBSD 1.3 で登場しました。 rc.d(8) をサポートする関数は、 NetBSD 1.5 で登場しました。 rc.subr スクリプトは、 FreeBSD 5.0 ではじめて登場しました。
September 23, 2012 FreeBSD