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