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で確認しましょう。