Skip to content

Linux リテラシ2006 - 第6回 デーモン

This content is not available in your language yet.

今回はデーモンというものに触れていきます。デーモンというのはシステムの中でユーザーには見えないような裏の部分で動いているものです。仕事内容はシステムの維持やユーザーに対してサービスを提供したりなどがあります。
デーモンと言われるとよく想像するのがdemon(悪魔)ですが、今回扱うデーモンはdaemon(守護神)のことを意味します。

デーモンの説明をする前準備として、先に必要となるいくつかの新たな概念の説明をします。

プロセスというのは現在動いているプログラムのことをさします。これはデーモンだけではなくコマンドなど、OS上で動いているものすべてです。コマンドのプロセスの生成から終了までは以下のようになります。

+キーボードでコマンドを入力してEnterで実行する
+OSがコマンドのプロセスを生成する
+生成されたプロセスがプログラム通りに処理を行う
+コマンドのプロセスを終了する

現在動作しているプログラムを見る

Section titled “現在動作しているプログラムを見る”
Terminal window
$ ps [オプション...]
  • オプション :a:他のユーザのプロセスも出力する
    :u:ユーザにとってわかりやすい形式にする
    :x:キーボードなどで制御されていないプロセスを表示する

:例:すべてのプロセスをわかりやすく表示する

Terminal window
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 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 cupsd
root 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 events
root 5853 0.0 0.0 2548 528 ? Ss Jun05 0:00 sdpd
httpd 13781 0.0 0.1 4708 1848 ? S Jun07 0:00 /usr/local/httpd/bin/httpd
foo   24160 0.0 0.0 3284 744 pts/0 R+ 09:12 0:00 ps aux

USERは誰の権限で実行しているかを表します。PIDはプロセスに割り振られたID番号でプロセスIDと呼びます。STATはそのプロセスが現在どんな状態であるかを表します。COMMANDはどんなコマンドやデーモンなどのプロセスが動いているかを表します。
今、実行したのはps auxというコマンドでしたが、コマンド以外にもいろんなプロセスが動いていることがよくわかると思います。

シグナルというのはプログラマがキーボードなどから信号を送って制御するためのものです。例としては暴走したプロセスを強制終了したり、現在動かしているプロセスを中断してやめるときなどに使います。たとえば以下の4種類などがあります。

種類用途
INT(INTerrupt)現在ユーザが実行しているプロセスに対して割り込みをかけます。端末上でCtrl+cと入力するとこの効果を得ます。
TERM(TERMinate)終了させるという意味どおり、プロセスを終了させるために使います。
HUP(HangUP)デーモンなどの設定ファイルなどについては再読み込みをすることもあります。
KILL(KILL)INTやTERMでは終了できないような(暴走している)プロセスを強制的に終了させるために使われます。
シグナルはコマンドを使っても送れます。コマンド名はkillです。
Terminal window
$ kill [オプション] シグナル プロセスID

:-s:シグナルを指定する

シグナルは上記のものなどを使います。
:例:プロセスID1234を終了させる。

Terminal window
$ kill -s TERM 1234

リンクとはコマンドでいうエイリアスのようなものです。リンクを作成するにはこのコマンドを使います。

ln [オプション] リンク元 リンクの置き場所

:-s:シンボリックリンクを作成する
:例:カレントディレクトリのhogeというファイルにbarというシンボリックリンクを作成する

Terminal window
$ ln -s hoge bar

確認してみましょう。確認にはlsコマンドに-lオプションをつけて実行します。

Terminal window
$ ls -l
-rw-rw-r-- 3 foo   foo 50 5月 1 21:21 hoge
lrwxrwxrwx 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/ディレクトリの内容です。

Terminal window
$ ls /etc/rc.d/init.d
FreeWnn crond httpd messagebus pcmcia sendmail
NetworkManager cups iiim microcode_ctl portmap single
acpid cups-config-daemon ipmi netdump psacct smartd
anacron diskdump iptables netfs rawdevices sshd
apmd dund irda netplugd readahead syslog
atd firstboot irqbalance network readahead_early vncserver
auditd functions isdn nfs rhnsd winbind
autofs gpm killall nfslock rpcgssd xfs
bluetooth haldaemon kudzu nscd rpcidmapd xinetd
canna halt mdmonitor ntpd rpcsvcgssd ypbind
cpuspeed hidd mdmpd pand saslauthd yum

ファイルサイズは、

Terminal window
$ ls -l /etc/rc.d/
drwxr-xr-x 2 root root 4096 6月 16 05:43 init.d

からわかるように4096となっています。

Terminal window
$ ln -s /etc/rc.d/init.d/ init

/etc/rc.d/init.dディレクトリに対してシンボリックリンクinitを作成しました。

Terminal window
$ cd init

シンボリックリンクinitに移動しました。

Terminal window
$ ls
FreeWnn crond httpd messagebus pcmcia sendmail
NetworkManager cups iiim microcode_ctl portmap single
acpid cups-config-daemon ipmi netdump psacct smartd
anacron diskdump iptables netfs rawdevices sshd
apmd dund irda netplugd readahead syslog
atd firstboot irqbalance network readahead_early vncserver
auditd functions isdn nfs rhnsd winbind
autofs gpm killall nfslock rpcgssd xfs
bluetooth haldaemon kudzu nscd rpcidmapd xinetd
canna halt mdmonitor ntpd rpcsvcgssd ypbind
cpuspeed hidd mdmpd pand saslauthd yum

内容が/etc/rc.d/init.d/ディレクトリとまったく同じです。

Terminal window
$ pwd
/home/foo/init

しかし、現在地は/etc/rc.d/init.d/ではありませんし、このinitのファイルサイズは

Terminal window
$ ls -l
lrwxrwxrwx 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障害復旧用
2CUIのみを使用する状態でネットワークをつながない場合
3    CUIのみを使用する場合
4使用されてません
5GUI環境を使用する場合
6再起動する場合
各ランレベルで何がマシン起動時にどのデーモンが起動するかは/etc/rc?.d/ディレクトリでlsコマンドを実行すると、どのデーモンが起動、停止するという一覧を表示してくれます。
※?にはランレベルが入ります。
:例:ランレベル5の設定を見る
[foo@cisnote ~]$ ls /etc/rc5.d
K-1ipmi K30spamassassin K85mdmpd S09pcmcia
K01yum K35vncserver K86nfslock S10network
K02NetworkManager K35winbind K87auditd S12syslog
K02cups-config-daemon K36lisa K87irqbalance S26apmd
K02haldaemon K40smartd K87portmap S28autofs
K03messagebus K44rawdevices K89netplugd S44acpid
K03rhnsd K50netdump K90bluetooth S55sshd
K05anacron K50xinetd K91isdn S85gpm
K05atd K68rpcidmapd K94diskdump S87iiim
K05saslauthd K69rpcgssd K96ipmi S90canna
K10cups K73ypbind K99microcode_ctl S90crond
K10psacct K74lm_sensors K99readahead S90xfs
K12FreeWnn K74nscd K99readahead_early S99local
K20nfs K74ntpd S05kudzu
K24irda K75netfs S06cpuspeed
K30sendmail K85mdmonitor S08iptables

K-1ipmi、S05kudzuこれらを例にとってみると、先頭の1文字がKだとそのサービスがマシン起動時に停止していることを表し、Sだと起動することを表します。

それでは、デーモンの説明に入ります。デーモンというのは総称で様々な種類のものがあります。例えば、ファイアウォール関係やWEBサーバ関係などがあります。起動しているデーモンは出番来るまでメインメモリに常駐して、いつ出番が来てもいいようにスタンバイをしているプロセスです。常日頃デスクトップ用途でマシンを使っている場合、このデーモンが動いているかどうかは、意識することはないものです。ですが、デーモンが働いていないとさまざまところで不具合が出ます。最悪の場合まともに起動しなくなることもあります。つまりデーモンが動いていることで初めてGUI環境で操作ができる、ネットワークにつながるなどといったサービスが提供されるのです。サービスは多くの場合ひとつのサービス対して、ひとつのデーモンが起動していることが条件ですが、サービスの中には二つ以上のデーモンが起動している事が条件となる場合もあります。

自動で起動するデーモンの設定

Section titled “自動で起動するデーモンの設定”

普段デーモンはマシンを起動したときに自動で起動します。起動するデーモンはntsysvというコマンドで変える事ができます。このコマンドはWindowsのスタートアップの設定に近いものです。

# ntsysv [オプション]

:—level 0~6までの数字:変更するランレベルを指定する
このコマンドはシステム的に重要なコマンドなのでrootでしか実行できません。su -でrootになってから実行しましょう。また、普段使わないと思われるデーモンは起動しないようにしましょう。理由はマシンのメモリを余計に取られてしまい処理速度が低下してしまう他、セキュリティにも無駄なリスクを抱えることにつながります。必要なデーモンであるかどうか適切に判断して設定するのがシステム管理の基本的な事柄の一つです。
:例:ntsysvコマンドをランレベル5に対して実行する

ntsysv --level 5

ntsysv.png
ここでチェックを入れると、チェックの入ったデーモンがマシン起動時に自動的に起動します。
その確認はランレベル5に対して実行したので、ランレベル5の設定を見ることで確認できます。

各種サービスの起動ファイルは、/etc/init.d/以下に配置されています。

# /etc/init.d/サービス名 起動オプション

:start:起動する
:stop:停止する
:restart:再起動する
:例:networkを再起動する

# /etc/init.d/network restart

このnetworkというデーモンはLinuxにおいてネットワーク接続を設定するデーモンです。

ここではデーモンによって提供されるサービスの例を紹介します。

これは決められた時間に設定されたコマンドを実行するサービスを実行するデーモンです。
データのバックアップなどをいちいち手作業でやっていたら煩雑かつ面倒です。そこでこのcrondの設定ファイルに毎週何時とか毎日何時にデータのバックアップを行うといったように書き込みcrondを再起動して設定を読み込ませれば、後はデーモンが自動でバックアップをとってくれます。

第5回で講義をしましたsshサーバー側で動いているデーモンです。サービスの内容はssh接続を提供するものです。
これが動いていないと、第4回ネットワークで説明しましたポート番号22番が開いていてもsshで接続することはできなくなります。また設定を変更したときにもsshdを再起動しないと設定の変更が有効になりません。

今までGUIでの終了方法しかわからなかったと思いますが、CUIもしくはコマンドで終了することができます。そのコマンドがshutdownコマンドです。

  • このコマンドはrootでしか行えないので注意してください
# shutdown オプション 時間

:-h:電源を切る
:-r:再起動する

:now:今すぐ実行する

shutdown -h now