8.2. Runlevelごとのサーバ起動
8.2. Runlevelごとのサーバ起動
サーバの起動は“/etc/rc.d/rc”を経由して行われます。この時に重要になるのが、
/etc/rc?.d(“?”の部分には0〜6のRunLevelの値が入る)
というディレクトリです。各ディレクトリには以下のようなファイル(シンボリックリンク)が用意されています。
ここにあるファイルは全て“/etc/init.d”以下に配置された実体からのリンクになっています。
$ cd /etc/rc3.d
$ ls
K01certmonger K50netconsole K80kdump K88rsyslog
K01smartd K50snmpd K80sssd K89portreserve
K02avahi-daemon K50snmptrapd K83bluetooth K89rdisc
K02oddjobd K60crond K83nfslock K90network
K05atd K60nfs K83rpcgssd K92ip6tables
K10cups K69rpcsvcgssd K83rpcidmapd K92iptables
K10psacct K72autofs K84NetworkManager K95firstboot
K10saslauthd K73ypbind K84wpa_supplicant S01sysstat
K15httpd K74acpid K85mdmonitor S02lvm2-monitor
K25sshd K74haldaemon K85messagebus S13cpuspeed
K30postfix K74ntpd K87irqbalance S26udev-post
K30spice-vdagentd K75netfs K87restorecond S99single
K36mysqld K75ntpdate K87rpcbind
K50dnsmasq K75quota_nld K88auditd
これらの命名法には特徴があり、
[SK] (二桁の数字)(名前)となっています。
- SもしくはK
S(start)はそのRunLevelに入る時に呼ばれ、K(kill)は別のRunLevelへ移る際(別のRunlevelから移った時に停止させる)に呼ばれます。 - 数字
優先順位です。数字が小さいほど優先順位が高く、早い段階で呼ばれます。 - 名前
本来のファイルと対応する名前を付けます。実際には、任意の文字列でかまいません。上述の数字が同じ値の場合には、アルファベット順で呼ばれます。
システムの起動の際にはこの“S??(??は00〜99)”というプログラム(スクリプト)が順に呼ばれていきます。SもKもリンク先の実体は同じです。したがって、実際にはパラメータを一つ渡して実体側で挙動を変更します。渡されるパラメータには以下のものがあります。
- start サービスの挙動を指示します
- stop サービスの停止を指示します
- restart
サービスの再起動を指示します。設定ファイルを変更した際、その変更を即時に反映させる目的で使われます。
つまり、/etc/rc.d/rcでは、例えばS50autofsが呼び出された場合には、
/etc/rc.d/rc?.d/S50autofs start
のように、引数にstartプログラムを渡してプログラム(スクリプト)が実行されます。Kは普通のサービスには不要なのですが、正常にサービスを停止させるために特定の方法があるという時に用います。具体的には、
- データベースサーバが残っていたトランザクションを処理してから終了させる
- カナ漢字変換サーバが辞書への処理を行ってから終了する
などの目的で使います。
(システム終了時には、残っているプログラムにはSIGTERMを送りつけますので、正しくプログラムされていれば、それ相応に終了してくれるはずです)
特定のRunLevelでサービスを起動させたければ、上述の命名規則にのっとってリンクを作成すればいいだけです。また、サービスを手動で制御したい場合には、実体である/etc/init.d以下の任意のプログラムに引数としてstart/stop/restartを指定して実行すればいいということです。とはいえ、呼び出しがちょっと面倒なので、補助するツールがいくつか存在します。
- (/sbin/)service
/etc/init.d以下のスクリプトを呼び出すツールです。
/sbin/servise [スクリプト名] start|stop|restart
という形で処理できますが、あらかじめ/etc/init.d/にあるスクリプト名がわかっていないと意味がないため、
/etc/init.d/??????????? start|stop|restart
とした方が補完を使えるため、間違いが起きにくいというメリットはあります。
- (/sbin)chkconfig
init.dからの特定のRunLevelのディレクトリにリンクを貼る/消すためのツールです。
/sbin/chkconfig [スクリプト名] on|off
という形で使用します。詳細はman chkconfigで確認しましょう。