Linux講座にようこそ。このページは「Linuxの使い方 - 付録1. SysVinitによるサービスの制御(chkconfigとserviceコマンド)です。

Linuxの使い方

付録

付録1. SysVinitによるサービスの制御(chkconfigとserviceコマンド)

OS起動時に自動的に起動するサービスの制御の方法はディストリビューションにより異なります。ここでは、従来から使われている「SysVinit」によるサービスの制御方法について説明します。

サービスの起動は実行レベル(ランレベルとも呼ぶ)により定義されており、実行レベルを変えることにより起動するサービスを変えることができます。システムの標準の実行レベルは/etc/inittabファイルに記述してあります。

実行レベルは0〜6まで定義されており、次のような意味が有ります。

【付表1-1】実行レベル一覧
実行レベル意味起動シェルスクリプトの場所
0システム停止/etc/rc.d/rc0.d/
1シングルユーザモード/etc/rc.d/rc1.d/
2マルチユーザモード(NFSの使用不可)/etc/rc.d/rc2.d/
3マルチユーザモード/etc/rc.d/rc3.d/
4未使用/etc/rc.d/rc4.d/
5Xウィンドウシステム、マルチユーザモード/etc/rc.d/rc5.d/
6リブート/etc/rc.d/rc6.d/

デスクトップ環境(KDEやGNOME)の場合は実行レベル5で、サーバーの場合は実行レベル3になります。また、実行レベル1(シングルユーザモード)はシステムに影響の有るメンテナンスや、障害の修復等を行うためのものです。

起動シェルスクリプト
【付図1-1】
起動シェルスクリプト

実行レベル毎のサービスの開始と停止は、付図1-1に示す/etc/rc.d/rc0.d/から/etc/rc.d/rc6.d/ディレクトリの下に用意されているシェルスクリプトで行います。これらのシェルスクリプトは実際には/etc/rc.d/init.d/に用意されており、各々のディレクトリにリンク(シンボリックリンク)が張られています。

シェルスクリプト名の先頭1文字が「S」のものはサービスの開始、「K」のものはサービスの停止を行います。但し、実際には1つのサービスの開始と停止は1つのシェルスクリプトで行うように作られており、スクリプト起動時の引数にstartが指定されたらサービスの開始、stopが指定されたら停止となります。つまり、シェルスクリプトの先頭1文字が「S」のものは引数がstartで、「K」のものはstopで実行されます。

実行の順序は名前で決まります(ASCIIコード順)ので、順序を制御したいときは名前の一部に付けた数字で調整します。つまり、最初に実行したいのであればファイル名を「S01XXX」、最期に実行したいのであれば「S99XXX」の様にします。

$ ls -l /etc/rc.d/rc5.d/S64mysqld /etc/rc.d/rc5.d/S85httpd ← 実行レベル5の時に実行するシェルスクリプトです
lrwxrwxrwx 1 root root 16 2010-06-02 17:09 /etc/rc.d/rc5.d/S64mysqld -> ../init.d/mysqld ← mysqld(MySQL)の開始シェルスクリプトです
lrwxrwxrwx 1 root root 15 2010-08-19 09:09 /etc/rc.d/rc5.d/S85httpd -> ../init.d/httpd ← httpd(Apache)の開始シェルスクリプトです
$
$ ls -l /etc/rc.d/rc0.d/K36mysqld /etc/rc.d/rc0.d/K15httpd ← 実行レベル0の時に実行するシェルスクリプトです
lrwxrwxrwx  1 root root 15 2010-08-19 09:09 /etc/rc.d/rc0.d/K15httpd -> ../init.d/httpd ← httpd(Apache)の停止シェルスクリプトです
lrwxrwxrwx. 1 root root 16 2010-05-13 11:38 /etc/rc.d/rc0.d/K36mysqld -> ../init.d/mysqld ← mysqld(MySQL)の停止シェルスクリプトです
$

上記、mysqldとhttpdの例の場合、開始シェルスクリプトはmysqldがS64でhttpdがS85ですので、mysqldが先に開始します。一方、停止シェルスクリプトはhttpdがK15でmysqldがK36ですので、httpdの方が先に停止します。このことにより、httpd開始時にはmysqldは開始済みですので、httpdからmysqldへの接続が行えますし、逆に、mysqld停止時にはhttpdは停止済み(切断済み)ですので、データベースが安全に保たれます。

サービス設定ツール(system-config-services)
【付図1-2】
サービス設定ツール(system-config-services)

デスクトップ環境の実行レベルは5ですが、この場合、サーバー関係のサービスは無効になっていますのでhttpd(Apache)は使えません。httpdのサービスをシステム起動時に自動的に開始したい場合は、設定によりサービスを有効にする必要があります。

実行レベルのサービスを変更したい場合は、リンクの追加(lnコマンド)と削除(rmコマンド)を行うことになりますが、これでは作業が難しいですので専用のGUIツールとコマンドが用意されています。

付図1-2はsystem-config-servicesというGUIのサービス設定ツールで、サービスの有効・無効、及び実行中のサービスの停止や開始等が行えます。また、サービスの説明なども表示されます。

デスクトップ環境の場合はGUIのサービス設定ツールが使えますが、サーバーの場合はコマンドで作業を行なうことになります。その場合はchkconfigコマンドとserviceコマンドを使うとよいでしょう。

※ サービス情况の表示
# chkconfig --list サービス名
※ サービスの有効・無効
# chkconfig --level 実行レベル サービス名 offまたはon
※ サービスの制御
# service サービス名 コマンド ← コマンドにはstart、stop、status等を指定できます

chkconfigコマンドはサービスの有効・無効を行ない、有効にしておきますと、次回のシステム起動時に自動的にサービスを開始します。システムを再起動しないで、サービスを開始・停止したい場合はserviceコマンドを使います。実際の使い方は次の例題をご覧下さい。

# chkconfig --list ← サービス情况を表示します(サービス名を省略すると全てのサービスを表示します)
NetworkManager  0:off    1:off    2:on    3:on    4:on    5:on    6:off
abrtd           0:off    1:off    2:off   3:off   4:off   5:off   6:off
acpid           0:off    1:off    2:on    3:on    4:on    5:on    6:off
atd             0:off    1:off    2:off   3:off   4:off   5:off   6:off

   (省略)

udev-post       0:off    1:on     2:on    3:on    4:on    5:on    6:off
vncserver       0:off    1:off    2:off   3:off   4:off   5:off   6:off
wpa_supplicant  0:off    1:off    2:off   3:off   4:off   5:off   6:off
ypbind          0:off    1:off    2:off   3:off   4:off   5:off   6:off
#
# chkconfig --list cups ← CUPSの設定を確認します
cups            0:off    1:off    2:off   3:off   4:off   5:off   6:off
#
# chkconfig --level 5 cups on ← 実行レベル5のCUPSを有効化します
# chkconfig --list cups ← CUPSの設定を確認します
cups            0:off    1:off    2:off   3:off   4:off   5:on   6:off
#
# service cups status ← CUPSの動作を確認します
cupsd は停止しています
# service cups start ← CUPSを起動します
cups を起動中:                                             [  OK  ]
#
# service cups stop ← CUPSを停止します
cups を停止中:                                             [  OK  ]
#

システム起動時に独自のサービスを開始したい場合は/etc/rc.d/rc.localスクリプトに開始コマンドを記述するとよいでしょう。このスクリプトは実行レベル2~5で「S99local」という名前(実際はリンク)で定義されています。