Linux講座にようこそ。このページは「Linuxの使い方 - 付録1. SysVinitによるサービスの制御(chkconfigとserviceコマンド)です。
OS起動時に自動的に起動するサービスの制御の方法はディストリビューションにより異なります。ここでは、従来から使われている「SysVinit」によるサービスの制御方法について説明します。
サービスの起動は実行レベル(ランレベルとも呼ぶ)により定義されており、実行レベルを変えることにより起動するサービスを変えることができます。システムの標準の実行レベルは/etc/inittabファイルに記述してあります。
実行レベルは0〜6まで定義されており、次のような意味が有ります。
実行レベル | 意味 | 起動シェルスクリプトの場所 |
---|---|---|
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/ |
5 | Xウィンドウシステム、マルチユーザモード | /etc/rc.d/rc5.d/ |
6 | リブート | /etc/rc.d/rc6.d/ |
デスクトップ環境(KDEやGNOME)の場合は実行レベル5で、サーバーの場合は実行レベル3になります。また、実行レベル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は停止済み(切断済み)ですので、データベースが安全に保たれます。
デスクトップ環境の実行レベルは5ですが、この場合、サーバー関係のサービスは無効になっていますのでhttpd(Apache)は使えません。httpdのサービスをシステム起動時に自動的に開始したい場合は、設定によりサービスを有効にする必要があります。
実行レベルのサービスを変更したい場合は、リンクの追加(lnコマンド)と削除(rmコマンド)を行うことになりますが、これでは作業が難しいですので専用のGUIツールとコマンドが用意されています。
付図1-2はsystem-config-servicesというGUIのサービス設定ツールで、サービスの有効・無効、及び実行中のサービスの停止や開始等が行えます。また、サービスの説明なども表示されます。
デスクトップ環境の場合はGUIのサービス設定ツールが使えますが、サーバーの場合はコマンドで作業を行なうことになります。その場合はchkconfigコマンドとserviceコマンドを使うとよいでしょう。
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」という名前(実際はリンク)で定義されています。