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

タグ:

スクリプトをバックグラウンドで動作するデーモンとして登録する方法。
「/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

参考

シェルスクリプトリファレンスの秘密兵器。例題から使い方がわかるサンプルスクリプト... 続き
本書は、シェルスクリプトを作成する際にみなさんの手助けとなるためのリファレンスブ... 続き
実用的なシェルスクリプトを作成するためのノウハウについて、数多くのサンプルプログ... 続き
シェルスクリプトの作成には言語自体だけでなくそれぞれのツールに対する理解も求めら... 続き
シェルスクリプトでやりたいことが簡単にわかる!シェルスクリプトの考え方がわかる。... 続き
本書では、特にUNIX系OSを利用するシステム管理者をターゲットに、日常的に利用... 続き

トラックバック(0)

このブログ記事を参照しているブログ一覧: デーモンプロセス制御のシェル関数を使ったデーモン登録

このブログ記事に対するトラックバックURL: http://daipresents.com/mt/bin/mt-tb.cgi/1350

コメントする


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

著者:Venkat Subramaniam, Andy Hunt, Shane Warden 税込2,520円
アジャイルの核心となるプラクティスについての、包括的かつ焦点の定まった簡潔な要約。特定のアジャイルな方法論を押し付けるのでなく、いろいろな方法論に共通するプラクティスを結びつけ、首尾一貫した全体像を描き出している。
著者:Yugui 税込 2,310 円
他言語でのプログラミング経験を持つ人を対象に、Rubyの特徴、Rubyならではの方法や慣習について解説。Rubyの基礎的な部分とメタクラスやブロック構文のような独自の概念、それらにまつわる文化を説明し、Ruby特有の考え方を知ってもらうことを目的としている。Ruby1.8及び1.9に対応している。 「BOOK」データベースより
著者:前田剛 税込 2,100 円
RubyonRailsで実施されたWebベースのプロジェクト管理システムRedmaineの解説書。

daipresents!!

҂̑蕨

tWn{ Google Code