デーモンプロセス制御のシェル関数を使ったデーモン登録

タグ:

スクリプトをバックグラウンドで動作するデーモンとして登録する方法。
「/etc/init.d/crond」を参考に調べた。

ここで使われるフォルダは以下になる。

  • /proc ・・・プロセス情報が入っている
  • /var/lock/subsys ・・・ lockファイル作成ディレクトリ
  • /var/run ・・・ プロセスIDが書かれたファイルを書き出す場所

/etc/init.d/functions

「/etc/init.d/functions」にはデーモンの制御に便利なシェル関数が書かれている。プロセスの確認、開始メッセージ表示など、普通のシェルでも使える内容になっている。

checkpid PID

指定されたPIDで起動していれば0、それ以外は1。「/proc」以下にPIDのフォルダがあるかで判断している。

daemon {+/-nicelevel} {program}

プログラムを開始する。

killproc [-d delay] {program} [signal]

プログラムを停止する。「/var/run」にあるPIDファイルは削除してくれる

pidfileofproc {program}

プログラムのPIDをみつける。「/var/run/{program}.pidのみ確認する。 PIDファイルがあれば0・・・なんだろうけど、return 1をしていないため、絶対0がかえってしまう。バグ? 以下の文で、PIDが不正かどうかチェックしている。
# First try "/var/run/*.pid" files
if [ -f /var/run/$base.pid ] ; then
        local line p pid=
        read line < /var/run/$base.pid
        for p in $line ; do
               [ -z "${p//[0-9]/}" -a -d /proc/$p ] && pid="$pid $p"
        done
        if [ -n "$pid" ]; then
                echo $pid
                return 0
        fi
fi

プロセスIDを確認する以下の部分では、まず0から9の数値をすべて空文字におきかえることができるかと、/proc/にプロセスIDのフォルダが存在するかで確認している。

[ -z "${p//[0-9]/}" -a -d /proc/$p ] && pid="$pid $p"
プロセスIDが空文字の場合はのちの「if [ -n "$pid" ]; then」で引っかかる。

pidofproc {program}

プログラムのPIDをみつける。「/var/run/{program}.pidをまず探し、それでなければ「pidof」コマンドを使って探す。存在すれば0を返す。それ以外は1。

status {program}

プログラムのステータスを確認する。

echo_success

成功メッセージ表示。

echo_failure

失敗メッセージ表示。

echo_passed

パスメッセージ表示。

echo_warning

警告メッセージ表示。

confirm

実行を確認できる。Yならば0、Nならば1、Continueならば2




デーモン作成

デーモン呼び出しする「fujidaemond」とスクリプト本体である「fujidaemon」を作成する。

デーモン呼び出しスクリプト

ここにスクリプト本体呼び出しを書いてもよい。
#! /bin/bash
#
# fujidaemond          Start/Stop the fujidaemon daemon.
#
# chkconfig: 2345 90 60
# description: sample program
# processname: fujidaemon
# config: none
# pidfile: /var/run/fujidaemon.pid

# Source function library.
. /etc/init.d/functions

# See how we were called.

prog="fujidaemon"

start() {
echo -n $"Starting $prog: "
if [ -e /var/lock/subsys/$prog ]; then
if [ -e /var/run/$prog.pid ] && [ -e /proc/`cat /var/run/$prog.pid` ]; then
echo -n $"cannot start $prog: $prog is already running.";
failure $"cannot start $prog: $prog already running.";
echo
return 1
fi
fi
daemon ./fujidaemon &
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog;
return $RETVAL
}

stop() {
echo -n $"Stopping $prog: "
if [ ! -e /var/lock/subsys/$prog ]; then
echo -n $"cannot stop $prog: $prog is not running."
failure $"cannot stop $prog: $prog is not running."
echo
return 1;
fi
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog;
return $RETVAL
}

rhstatus() {
status $prog
}

restart() {
stop
start
}

reload() {
echo -n $"Reloading $prog daemon configuration: "
killproc $prog -HUP
RETVAL=$?
echo
return $RETVAL
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
status)
rhstatus
;;
condrestart)
[ -f /var/lock/subsys/$prog ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
exit 1
esac

exit 0


スクリプト本体


役割的にはデーモン呼び出し部分でやるのは変かなーと思ったので、プロセスIDの出力などはスクリプト本体で行うようにした。
とりあえず、なんもしないスクリプト。
#!/bin/bash

prog=fujidaemon

touch /var/run/$prog
echo $$ > /var/run/$prog

while true; do
sleep 1
done

参考

シェルスクリプトリファレンスの秘密兵器。例題から使い方がわかるサンプルスクリプト160、キーワードから探す基礎コマンドと文法50。
実用的なシェルスクリプトを作成するためのノウハウについて、数多くのサンプルプログラムと共に説明している。
学びたい人も、使いたい人もこれ一冊でOK!チュートリアル&サンプルシェルスクリプトのAll‐in‐Oneブック、最新シェル対応版。
シェルスクリプトの作成には言語自体だけでなくそれぞれのツールに対する理解も求められます。つまり、あるツールが何のためのものであり、それを単体あるいは他のプログラ... 続き
本書は、シェルスクリプトを作成する際にみなさんの手助けとなるためのリファレンスブックです。シェルの組み込みコマンドを中心にして、それぞれがどういった働きをしてど... 続き
本書はメジャーなLinuxディストリビューションのほとんどで基本シェルとして利用され、7年以上の実績がある「bashバージョン2」を利用して、比較的短いプログラ... 続き

コメントする


画像の中に見える文字を入力してください。

Mike Cohn (著), マイク コーン (著), 安井 力 (翻訳), 角谷 信太郎 (翻訳)
採用した現在のタイトルは、見積りや計画づくりといったプロセスを、アジャイルに進めなければならないと謳っているのだ。見積りと計画づくりがアジャイルでないのに、プロジェクトがアジャイルであるということはありえない。

メアリー・ポッペンディーク (著), トム・ポッペンディーク (著), 高嶋 優子 (翻訳), 天野 勝 (翻訳), 平鍋 健児 (翻訳) 「トヨタ生産方式」を源流にする「リーン開発」をソフトウエア開発に取り入れるための具体的方法を紹介した本です。製造分野から始まったリーン活動は、その原則を理解しないままプラクティスだけを開発分野に適用しようとしても、行き詰るか失敗に終わってしまいます。本書は、リーンの7大原則を「価値」「ムダ」「スピード」「人」「知識」「品質」「パートナー」に整理し、ソフト開発現場にどうしたら効果的に適用できるかを、多くの実例を交えながら具体的に説明します。

著者:Yugui 税込 2,310 円
本書は、他言語でのプログラミング経験を持つ人を対象に、Rubyの特徴、Rubyならではの方法や慣習について解説します。これはRubyの資料を読んで実践的な学習を進めていくために必要な前提知識です。本書はRubyの基礎的な部分とメタクラスやブロック構文のような独自の概念、それらにまつわる文化を説明し、Ruby特有の考え方を知ってもらうことを目的としています。

本書は、Railsの入門からリファレンスまでをわかりやすく解説した書籍です。第1部と第2部では、Railsの背景にある概念について説明し、あっという間に簡単なオンラインストアを開発してみせます。

著者:James Shore, Shane Warden アジャイル開発は人のなせる技である。アジャイル開発を極めるためには、その時々で無数の可能性を評価して最善の方策を選択することを学ぶ必要がある。本書は、あなたがアジャイル開発の「道」を極める手助けをしたい。

daipresents!! ҂̑蕨

tWn{github tWn{Google Code