Hatena::ブログ(Diary)

cooldaemonの備忘録 RSSフィード

2009-03-09

daemontools で dt-run を利用した監視サービスの追加方法

Google で検索しても、あまり解説を見かけなかったので、さらっとメモを残します。

前提条件

このあたりを、RPM でインストール済みであると仮定。(daemontools、functions、runlevelconf、dt-run がインストール済みで、svscan が /service 配下を監視中という状態)

サービス用のディレクトリやファイルを作成

% tree -pug /var/service/sample
/var/service/sample
|-- [drwxr-sr-x log_user log_user]  log
|   `-- [-rwxr-xr-x log_user log_user]  run
`-- [-rwxr-xr-x root     root    ]  run

1 directory, 2 files

sample、sample/log ディレクトリ共に、パーミッションを g+s にしておく。

% cat /var/service/sample/run
#!/bin/bash
exec 2>&1

exec /usr/bin/env - PATH="/usr/bin:/usr/local/bin" \
  FOO=bar \
setuidgid run_user \
/home/run_user/test.pl

環境変数の値や、実行ファイルの配置場所などはお好みで。

% cat /var/service/sample/log/run
#!/bin/bash
  
DLOGCONFDIR="/var/service/multilog"
SLOGCONFDIR="/var/service/sample"
LOGUSER="log_user"
  
PATH=/command:/command:/bin:/usr/bin:/usr/sbin; export PATH
  
defaultsize="$DLOGCONFDIR/filesize"
filesize="$SLOGCONFDIR/filesize"

if [ -s $filesize ]; then
  
    FILESIZE="s$(sed -e "s},}}g" \
                       -e "s}\.}}g" \
                       -e "s} }}g" \
                       -e "/^ *$/d" \
                       $filesize | head -1)"

elif  [ -s $defaultsize ]; then

    FILESIZE="s$(sed -e "s},}}g" \
                       -e "s}\.}}g" \
                       -e "s} }}g" \
                       -e "/^ *$/d" \
                       $defaultsize | head -1)"
fi

defaultno="$DLOGCONFDIR/fileno"
fileno="$SLOGCONFDIR/fileno"

if [ -s $fileno ]; then

    FILENO="n$(sed -e "s},}}g" \
                     -e "s}\.}}g" \
                     -e "s} }}g" \
                     -e "/^ *$/d" \
                     $fileno | head -1)"
  
elif  [ -s $defaultno ]; then
  
    FILENO="n$(sed -e "s},}}g" \
                     -e "s}\.}}g" \
                     -e "s} }}g" \
                     -e "/^ *$/d" \
                     $defaultno | head -1)"
fi
  
exec setuidgid $LOGUSER multilog t $FILENO $FILESIZE ./main

RPM でインストールを行なうと、/var/service/multilog ディレクトリが作成されているハズだが、無ければ作成。(作らなくても良いけど)

% cat /var/service/multilog/fileno
100
% cat /var/service/multilog/filesize
10,000,000

サービスを追加

/var/service/dt-run/dt-list に下記を追加。

sample:3,5:

上記例では、run level が 3 と 5 の時に sample が起動するという意味になる。

dt-list の書式は、このあたりを参照の事。

最後に、/command/add-service.sh コマンドでサービスを追加する。

% sudo /command/add-service.sh sample

これで、/service/sample リンクと、sample の起動停止などを行なう専用コマンド /command/sample.init が作成される。

ちなみに、sample の代わりに list を指定する事で、dt-list に記述されているサービスの一覧が表示される。

また、/command/remove-service.sh でサービスの削除ができる。

サービスを操作

/command/sample.init を引数無しで実行すると、ヘルプが出るので詳細は割愛。

% sudo /command/sample.init
sample.init:
alrm    - send an ALRM signal to sample
cdb     - create cdb file for sample
cont    - recover sample from a pause
int     - send sample an INT signal
kill    - send sample a KILL signal
pause   - pause sample
reload  - HUP sample; causes it to reload certain files
restart - stop then start sample
start   - start sample
status  - check on sample's status
stop    - stop sample
term    - send sample a TERM signal

2007-01-18

cron 等でコマンド実行の排他制御を行う

個人的によく使うのだけれど、案外、周りで使われていないようなので、書いときます。

例えば、下記のような感じで crontab を書いた場合

setlock は毎分実行されるが、sleep は毎時実行される。

*/1 * * * * /usr/local/bin/setlock -nx /tmp/hoge.lock sleep 3600

setlock は、 /tmp/hoge.lock をロック可能であればロックして、sleep を実行する。

/tmp/hoge.lock が存在しなれば、新規に作成する。

-n オプションが付いているので、ロックに失敗した場合は、ロック可能になるまで待たずに終了する。