Linux リテラシ2006 - 第6回 デーモン
This content is not available in your language yet.
今回はデーモンというものに触れていきます。デーモンというのはシステムの中でユーザーには見えないような裏の部分で動いているものです。仕事内容はシステムの維持やユーザーに対してサービスを提供したりなどがあります。
デーモンと言われるとよく想像するのがdemon(悪魔)ですが、今回扱うデーモンはdaemon(守護神)のことを意味します。
デーモンの説明をする前準備として、先に必要となるいくつかの新たな概念の説明をします。
プロセスというのは現在動いているプログラムのことをさします。これはデーモンだけではなくコマンドなど、OS上で動いているものすべてです。コマンドのプロセスの生成から終了までは以下のようになります。
+キーボードでコマンドを入力してEnterで実行する
+OSがコマンドのプロセスを生成する
+生成されたプロセスがプログラム通りに処理を行う
+コマンドのプロセスを終了する
現在動作しているプログラムを見る
Section titled “現在動作しているプログラムを見る”$ ps [オプション...]- オプション
:a:他のユーザのプロセスも出力する
:u:ユーザにとってわかりやすい形式にする
:x:キーボードなどで制御されていないプロセスを表示する
:例:すべてのプロセスをわかりやすく表示する
$ ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 3216 560 ? S Jun05 0:00 init [3]root 2 0.0 0.0 0 0 ? S Jun05 0:00 [migration/0]root 3 0.0 0.0 0 0 ? SN Jun05 0:00 [ksoftirqd/0]root 4 0.0 0.0 0 0 ? S Jun05 0:00 [migration/1]root 5 0.0 0.0 0 0 ? SN Jun05 0:00 [ksoftirqd/1]root 6 0.0 0.0 0 0 ? S< Jun05 0:00 [events/0]…中略…root 3494 0.0 0.2 9396 2252 ? SNs Jun05 0:00 cupsdroot 5818 0.0 0.0 0 0 ? S< Jun05 0:00 [krfcommd]root 5849 0.0 0.0 3336 876 ? Ss Jun05 0:00 hcid: processing eventsroot 5853 0.0 0.0 2548 528 ? Ss Jun05 0:00 sdpdhttpd 13781 0.0 0.1 4708 1848 ? S Jun07 0:00 /usr/local/httpd/bin/httpdfoo 24160 0.0 0.0 3284 744 pts/0 R+ 09:12 0:00 ps auxUSERは誰の権限で実行しているかを表します。PIDはプロセスに割り振られたID番号でプロセスIDと呼びます。STATはそのプロセスが現在どんな状態であるかを表します。COMMANDはどんなコマンドやデーモンなどのプロセスが動いているかを表します。
今、実行したのはps auxというコマンドでしたが、コマンド以外にもいろんなプロセスが動いていることがよくわかると思います。
シグナルというのはプログラマがキーボードなどから信号を送って制御するためのものです。例としては暴走したプロセスを強制終了したり、現在動かしているプロセスを中断してやめるときなどに使います。たとえば以下の4種類などがあります。
| 種類 | 用途 |
|---|---|
| INT(INTerrupt) | 現在ユーザが実行しているプロセスに対して割り込みをかけます。端末上でCtrl+cと入力するとこの効果を得ます。 |
| TERM(TERMinate) | 終了させるという意味どおり、プロセスを終了させるために使います。 |
| HUP(HangUP) | デーモンなどの設定ファイルなどについては再読み込みをすることもあります。 |
| KILL(KILL) | INTやTERMでは終了できないような(暴走している)プロセスを強制的に終了させるために使われます。 |
| シグナルはコマンドを使っても送れます。コマンド名はkillです。 |
$ kill [オプション] シグナル プロセスID:-s:シグナルを指定する
シグナルは上記のものなどを使います。
:例:プロセスID1234を終了させる。
$ kill -s TERM 1234リンクとはコマンドでいうエイリアスのようなものです。リンクを作成するにはこのコマンドを使います。
ln [オプション] リンク元 リンクの置き場所:-s:シンボリックリンクを作成する
:例:カレントディレクトリのhogeというファイルにbarというシンボリックリンクを作成する
$ ln -s hoge bar確認してみましょう。確認にはlsコマンドに-lオプションをつけて実行します。
$ ls -l-rw-rw-r-- 3 foo foo 50 5月 1 21:21 hogelrwxrwxrwx 1 foo foo 4 6月 19 10:52 bar -> hoge第二回のアクセス権の項で説明したファイルタイプの場所にlというのが表示されています。これはシンボリックリンクのファイルタイプを表すものです。また「-> hoge」というのはこのファイルはhogeというファイルへのリンクであることを示します。
シンボリックリンクと通常のリンクの違い
Section titled “シンボリックリンクと通常のリンクの違い”lnコマンドでオプションをつけずに作成されたリンクはハードリンクと呼ばれ、コピーと違いリンク元と変更などすべて同じファイルとして扱います。そのため、ファイルの情報を集めて作成されたiノードという番号は同じものを使用されます。シンボリックリンクというのは、第3回で説明しました、エイリアスのようにファイルやディレクトリに対して別名をつけるようなイメージでリンクを作成してもどのファイルへのリンクが明示されるだけで、実際このファイルそのものは内容を持ちません。ただ、ディレクトリにシンボリックリンクを作成するとあたかもシンボリックリンクの中に元でファイルやディレクトリが存在しているように見えるためシンボリックリンクはWindowsでいうショートカットのようなものとして理解できると思います。
例えば/etc/rc.d/init.d/というディレクトリにシンボリックリンクを作成して様子を見てみましょう。
シンボリックリンク元である/etc/rc.d/init.d/ディレクトリの内容です。
$ ls /etc/rc.d/init.dFreeWnn crond httpd messagebus pcmcia sendmailNetworkManager cups iiim microcode_ctl portmap singleacpid cups-config-daemon ipmi netdump psacct smartdanacron diskdump iptables netfs rawdevices sshdapmd dund irda netplugd readahead syslogatd firstboot irqbalance network readahead_early vncserverauditd functions isdn nfs rhnsd winbindautofs gpm killall nfslock rpcgssd xfsbluetooth haldaemon kudzu nscd rpcidmapd xinetdcanna halt mdmonitor ntpd rpcsvcgssd ypbindcpuspeed hidd mdmpd pand saslauthd yumファイルサイズは、
$ ls -l /etc/rc.d/drwxr-xr-x 2 root root 4096 6月 16 05:43 init.dからわかるように4096となっています。
$ ln -s /etc/rc.d/init.d/ init/etc/rc.d/init.dディレクトリに対してシンボリックリンクinitを作成しました。
$ cd initシンボリックリンクinitに移動しました。
$ lsFreeWnn crond httpd messagebus pcmcia sendmailNetworkManager cups iiim microcode_ctl portmap singleacpid cups-config-daemon ipmi netdump psacct smartdanacron diskdump iptables netfs rawdevices sshdapmd dund irda netplugd readahead syslogatd firstboot irqbalance network readahead_early vncserverauditd functions isdn nfs rhnsd winbindautofs gpm killall nfslock rpcgssd xfsbluetooth haldaemon kudzu nscd rpcidmapd xinetdcanna halt mdmonitor ntpd rpcsvcgssd ypbindcpuspeed hidd mdmpd pand saslauthd yum内容が/etc/rc.d/init.d/ディレクトリとまったく同じです。
$ pwd/home/foo/initしかし、現在地は/etc/rc.d/init.d/ではありませんし、このinitのファイルサイズは
$ ls -llrwxrwxrwx 1 foo foo 17 6月 21 00:36 init -> /etc/rc.d/init.d/からわかるように17しかありません。
Linuxには起動のレベルがあり、0~6までのレベルがあります。これをランレベルといい、起動時にどのレベルで動作させるかは/etc/inittabで設定されています。このファイルで注目すべきは以下のところです。
# Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)#id:5:initdefault:これはそれぞれのランレベルの簡単な説明と最後のid:5:initdefault:はランレベル5で起動するという意味になります。
主に使われるランレベルは1,3,5のいずれかでそれぞれの用途は下記になります。ただしこれはCentOS、FedoraCoreをはじめとするRedHat系のディストリビューションでの話で、他のディストリビューションでは異なる事もあります。
| ランレベル | 用途 |
|---|---|
| 0 | コンピュータの電源を切る |
| 1 | 障害復旧用 |
| 2 | CUIのみを使用する状態でネットワークをつながない場合 |
| 3 | CUIのみを使用する場合 |
| 4 | 使用されてません |
| 5 | GUI環境を使用する場合 |
| 6 | 再起動する場合 |
| 各ランレベルで何がマシン起動時にどのデーモンが起動するかは/etc/rc?.d/ディレクトリでlsコマンドを実行すると、どのデーモンが起動、停止するという一覧を表示してくれます。 | |
| ※?にはランレベルが入ります。 | |
| :例:ランレベル5の設定を見る |
[foo@cisnote ~]$ ls /etc/rc5.dK-1ipmi K30spamassassin K85mdmpd S09pcmciaK01yum K35vncserver K86nfslock S10networkK02NetworkManager K35winbind K87auditd S12syslogK02cups-config-daemon K36lisa K87irqbalance S26apmdK02haldaemon K40smartd K87portmap S28autofsK03messagebus K44rawdevices K89netplugd S44acpidK03rhnsd K50netdump K90bluetooth S55sshdK05anacron K50xinetd K91isdn S85gpmK05atd K68rpcidmapd K94diskdump S87iiimK05saslauthd K69rpcgssd K96ipmi S90cannaK10cups K73ypbind K99microcode_ctl S90crondK10psacct K74lm_sensors K99readahead S90xfsK12FreeWnn K74nscd K99readahead_early S99localK20nfs K74ntpd S05kudzuK24irda K75netfs S06cpuspeedK30sendmail K85mdmonitor S08iptablesK-1ipmi、S05kudzuこれらを例にとってみると、先頭の1文字がKだとそのサービスがマシン起動時に停止していることを表し、Sだと起動することを表します。
それでは、デーモンの説明に入ります。デーモンというのは総称で様々な種類のものがあります。例えば、ファイアウォール関係やWEBサーバ関係などがあります。起動しているデーモンは出番来るまでメインメモリに常駐して、いつ出番が来てもいいようにスタンバイをしているプロセスです。常日頃デスクトップ用途でマシンを使っている場合、このデーモンが動いているかどうかは、意識することはないものです。ですが、デーモンが働いていないとさまざまところで不具合が出ます。最悪の場合まともに起動しなくなることもあります。つまりデーモンが動いていることで初めてGUI環境で操作ができる、ネットワークにつながるなどといったサービスが提供されるのです。サービスは多くの場合ひとつのサービス対して、ひとつのデーモンが起動していることが条件ですが、サービスの中には二つ以上のデーモンが起動している事が条件となる場合もあります。
自動で起動するデーモンの設定
Section titled “自動で起動するデーモンの設定”普段デーモンはマシンを起動したときに自動で起動します。起動するデーモンはntsysvというコマンドで変える事ができます。このコマンドはWindowsのスタートアップの設定に近いものです。
# ntsysv [オプション]:—level 0~6までの数字:変更するランレベルを指定する
このコマンドはシステム的に重要なコマンドなのでrootでしか実行できません。su -でrootになってから実行しましょう。また、普段使わないと思われるデーモンは起動しないようにしましょう。理由はマシンのメモリを余計に取られてしまい処理速度が低下してしまう他、セキュリティにも無駄なリスクを抱えることにつながります。必要なデーモンであるかどうか適切に判断して設定するのがシステム管理の基本的な事柄の一つです。
:例:ntsysvコマンドをランレベル5に対して実行する
ntsysv --level 5
ここでチェックを入れると、チェックの入ったデーモンがマシン起動時に自動的に起動します。
その確認はランレベル5に対して実行したので、ランレベル5の設定を見ることで確認できます。
各種サービスの起動や停止
Section titled “各種サービスの起動や停止”各種サービスの起動ファイルは、/etc/init.d/以下に配置されています。
# /etc/init.d/サービス名 起動オプション起動オプション
Section titled “起動オプション”:start:起動する
:stop:停止する
:restart:再起動する
:例:networkを再起動する
# /etc/init.d/network restartこのnetworkというデーモンはLinuxにおいてネットワーク接続を設定するデーモンです。
デーモンの例
Section titled “デーモンの例”ここではデーモンによって提供されるサービスの例を紹介します。
これは決められた時間に設定されたコマンドを実行するサービスを実行するデーモンです。
データのバックアップなどをいちいち手作業でやっていたら煩雑かつ面倒です。そこでこのcrondの設定ファイルに毎週何時とか毎日何時にデータのバックアップを行うといったように書き込みcrondを再起動して設定を読み込ませれば、後はデーモンが自動でバックアップをとってくれます。
第5回で講義をしましたsshサーバー側で動いているデーモンです。サービスの内容はssh接続を提供するものです。
これが動いていないと、第4回ネットワークで説明しましたポート番号22番が開いていてもsshで接続することはできなくなります。また設定を変更したときにもsshdを再起動しないと設定の変更が有効になりません。
シャットダウンをする
Section titled “シャットダウンをする”今までGUIでの終了方法しかわからなかったと思いますが、CUIもしくはコマンドで終了することができます。そのコマンドがshutdownコマンドです。
- このコマンドはrootでしか行えないので注意してください
# shutdown オプション 時間:-h:電源を切る
:-r:再起動する
:now:今すぐ実行する
今すぐ電源を切る
Section titled “今すぐ電源を切る”shutdown -h now