daemontoolsを使う

2004.11.21新規作成。
2005.9.4更新。

daemontoolsは、サービス(デーモン)を起動したり状況を確認するツール。サービスを統一的に扱うことができる。

インストール

daemontoolsは、下記から入手できる。

まずはアーカイブを展開する。結構不思議なディレクトリ構成になっている。また、コンパイル、インストール方法も一風変わっている。

展開すると、次のようなディレクトリ構成になっている。

   admin/daemontools-0.76/package
                         /src

とりあえず展開して、ディレクトリ構成を調整する。

/opt/src$ tar xzvf daemontools-0.76.tar.gz 
/opt/src$ mv admin/daemontools-0.76 .	
/opt/src$ rmdir admin

オリジナルそのままではコンパイルエラーになるので、パッチを当ててからコンパイルする。patches for djb tools

コンパイルからインストールまでは、package/install コマンド一発でできる。install コマンドは、内部で compile, upgrade を呼び出し、さらにrunコマンドでsvscanを起動する。

ステップごとに見ていくと、compileコマンドは、commandディレクトリを作成し、そこにコンパイル済みのコマンドを格納していく。

/opt/daemontools-0.76$ patch -s -p1 < daemontools-0.76-q1.diff 
/opt/daemontools-0.76$ package/compile

インストールは、package/upgrade コマンドで行う。これは、/command ディレクトリを作成し、そこから上記の実体へのリンクを張っていく。さらに、/usr/local/bin からもリンクを張る。

package/run コマンドは、/service ディレクトリを作成する。加えて、/etc/inittab ファイルにsvscanboot コマンドを起動するための行を追加し、実行する。

/opt/daemontools-0.76$ su
/opt/daemontools-0.76# package/upgrade
/opt/daemontools-0.76# package/run

Note.

(2008.5.23追記。)

Fedora 9 Linuxで、起動時タスクの処理が /sbin/init デーモンから upstart に変更になりました。/etc/inittab ファイルは使われなくなり、/etc/event.d/ 以下に記述するようになりました。

とりあえずは、/etc/rc.d/rc.local ファイルに svscanboot コマンドを起動する行を加筆すれば大丈夫です。

インストール後は、次のようなディレクトリ構成になる。

   /command      各コマンドへのリンクが生成される。
   /service
   /opt/daemontools       --> daemontools-0.76へのシンボリックリンク
       /daemontools-0.76
                        /command

/etc/inittab には、次の行が加わる。

SV:123456:respawn:/command/svscanboot

サービスの登録

サービス(デーモン)を登録するには、/service ディレクトリにサブディレクトリを作ればいい。そのサブディレクトリにrun というコマンドがあれば、自動的に起動される。

/service に作るディレクトリは、別のディレクトリへのシンボリックリンクでもよい。また、ディレクトリ名が'.'で始まる場合は無視される。

runコマンドを書くときの注意:

  • シグナルを受け取れるように、新しいプロセスとしてではなく、シェルを置き換えるように起動する。
  • コマンドに'&'を付けない。フォアグラウンドで動かすこと。

例えば、clockspeedを起動するためのスクリプトを書いてみる。これを /service/.clockspeed/runとして保存する。runファイルには実行属性を付けておく。

#!/bin/sh
exec -c /usr/local/bin/clockspeed

Note.

execコマンドは、現在のプロセスを置き換える形でプログラムを実行する。POSIXポータブルな書式は次のとおり。

exec [command [argument...]]

bashは、上記に加え、-c, -l, -aオプションを持つ。-c オプションは、環境変数を空にしてからcommand を起動する。

envコマンドもよく使う。envコマンドは環境変数を変更した上でプログラムを実行する。POSIXでの書式は次のとおり。

env [-i] [name=value]... [command [argument...]]

-iオプションは、引き継いだ環境変数を無視して、空の環境から始める。

そしてclockspeedへ名前を変更する。

# mv .clockspeed clockspeed

サービスが動いているかどうかは、svstatコマンドで確認できる。引数としてディレクトリ名を付ける。

# svstat /service/clockspeed
/service/clockspeed: up (pid 28727) 61 seconds

サービスの制御

サービスの状態を表示したり、サービスを一時停止したりするのは、svstatコマンド、svcコマンドで行う。

svc - サービスの停止と再開、サービスにシグナルを送る

svcコマンドは次のように書く。ディレクトリ名は、サービスのディレクトリ(/service/clockspeed など)。

# svc オプション ディレクトリ名

オプションは、下記のとおり。The svc program

  • -u: Up. If the service is not running, start it. If the service stops, restart it.
  • -d: Down. If the service is running, send it a TERM signal and then a CONT signal. After it stops, do not restart it.
  • -o: Once. If the service is not running, start it. Do not restart it if it stops.
  • -p: Pause. Send the service a STOP signal.
  • -c: Continue. Send the service a CONT signal.
  • -h: Hangup. Send the service a HUP signal.
  • -a: Alarm. Send the service an ALRM signal.
  • -i: Interrupt. Send the service an INT signal.
  • -t: Terminate. Send the service a TERM signal.
  • -k: Kill. Send the service a KILL signal.
  • -x: Exit. supervise will exit as soon as the service is down. If you use this option on a stable system, you're doing something wrong; supervise is designed to run forever.

設定の変更を有効にするために、サービスをいったん終了させたいときは、次のようにする。runスクリプトを書き換えるときもこのコマンドを使う。

# svc -t /service/dnscache

一時的な停止と再開。

# svc -d /service/dnscache
# svc -u /service/dnscache

サービスを終了させるには、/service/foo を /service/.foo に名前を変えた上で、-tx オプションをつけてsvcを呼び出す。

svstat - サービスの状態を表示

svstat コマンドは、サービスの状態を表示する。

# svstat /service/dnscache
/service/dnscache: up (pid 21578) 203 seconds

サイト内関連文書

Linuxで時計をあわせる (clockspeed)
システムの時計を調整し、時刻をただしく刻むには。
qmailのインストール

外部リンク