CentOS 5.6でstart-stop-daemonを使ってみた

CentOS 5.6でstart-stop-daemonを使った時の備忘録です。

■説明
数年前に使った「start-stop-daemon」をふと思い出したため忘れないように備忘録として書きます。
この「start-stop-daemon」を使用すると簡単にスクリプトをdaemon化することが可能です。
「start-stop-daemon」は、CentOSのパッケージには含まれていませんがC言語に移植されたものが公開されているのでそれを使います。
# Perlを使えって言わないでね・・・。

ここでは、簡単な例としてpostfixのdaemonが落ちたら自動起動するようなスクリプトを作成して「start-stop-daemon」でdaemon化してみます。

■使用OS
CentOS 5.6 64bit

■start-stop-daemonバージョン
1_9_18-2

■前提条件
postfixがインストールされていて起動していること

■star-stop-daemonダウンロード先
http://www.linuxquestions.org/questions/linux-software-2/using-debian-start-stop-daemon-on-centos-680223/

(1)start-stop-daemonをダウンロード

1
2
[root@example ~]# cd /usr/local/src/
[root@example src]# wget "http://api.viglink.com/api/click?format=go&key=f54c4a1ec396e35bf83ba9f417fedbaf&loc=http%3A%2F%2Fwww.linuxquestions.org%2Fquestions%2Flinux-software-2%2Fusing-debian-start-stop-daemon-on-centos-680223%2F&v=1&libid=1307714398670&out=http%3A%2F%2Fdeveloper.axis.com%2Fdownload%2Fdistribution%2Fapps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz&ref=http%3A%2F%2Fwww.sssg.org%2Fblogs%2Fnaoya%2Farchives%2F1097&title=Using%20debian%20start-stop-daemon%20on%20Centos&txt=http%3A%2F%2Fdeveloper.axis.com%2Fdownload%2Fd..._9_18-2.tar.gz"


(2)start-top-daemonを解凍

1
[root@example src]# tar zxvf apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz


(3)start-stop-daemonのMakefileを修正

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@example src]# cd apps/sys-utils/start-stop-daemon-IR1_9_18-2/
[root@example start-stop-daemon-IR1_9_18-2]# vi Makefile
AXIS_USABLE_LIBS = GLIBC UCLIBC
#include $(AXIS_TOP_DIR)/tools/build/Rules.axis # コメントアウト

PROG = start-stop-daemon

all: $(PROG)

install: all
        install -m 0755 -o root -g root $(PROG) $(prefix)/sbin # installに修正

clean:
        rm -f $(PROG)


(4)start-stop-daemonのインストール

1
2
3
[root@example start-stop-daemon-IR1_9_18-2]# make && make install
cc     start-stop-daemon.c   -o start-stop-daemon
install -m 0755 -o root -g root start-stop-daemon /sbin


(5)postfixの監視スクリプトを作成

1
2
3
4
5
6
7
8
9
10
11
12
[root@example ~]# cd /usr/local/bin/
[root@example bin]# vi postfix_check.sh
#!/bin/sh
while :
 do
  ps aux | grep postfix | grep -v -e "grep" -e "postfix_check.sh" > /dev/null 2>&1
   if [ $? -ne 0 ] ; then
    /etc/rc.d/init.d/postfix start > /dev/null 2>&1
   fi
  sleep 10
 done
[root@example bin]# chmod +x postfix_check.sh

※上記スクリプトは10秒間隔で、postfixのプロセス監視を行い落ちていた場合は再起動させる。

(6)起動スクリプトの作成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@example ~]# vi /etc/rc.d/init.d/postfix_check
#!/bin/sh
#
# description: postfix daemon check script.
# chkconfig: 2345 85 35
#
prog=postfix_check
STD=/sbin/start-stop-daemon
PID=/var/run/postfix_check.pid
CMD=/usr/local/bin/postfix_check.sh
[ -x $CMD ] || exit 1
[ -x $STD ] || exit 1

[ -f /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions

start() {
        [ ! -f $PID ] || exit 1
        $STD --start --pidfile $PID --make-pidfile --background
        --exec $CMD
        [ $? -eq 0 ] && echo -n $"Starting $prog: " && success && echo ;
        exit 0
        [ $? -ne 0 ] && echo -n $"Starting $prog: " && failure && echo ;
        exit 1
        }

stop() {
        [ -f $PID ] || exit 1
        kill `cat $PID`
        [ $? -eq 0 ] && echo -n $"Stopping $prog: " && success && echo ;
        rm $PID ; exit 0
        [ $? -ne 0 ] && echo -n $"Stopping $prog: " && failure && echo ;
        exit 1
        }

status() {
        [ -f $PID ] && echo "$0 PID:`cat $PID`"
        }

case $1 in
        start ) start ;;
        stop ) stop ;;
        status ) status ;;
esac
[root@example ~]# chmod +x /etc/rc.d/init.d/postfix_check


(7)postfix_checkを起動

1
2
[root@example ~]# service postfix_check start
postfix_check を起動中:                                    [  OK  ]


(8)postfixのプロセスが起動しているか確認

1
2
3
4
5
6
[root@example ~]# ps aux | grep postfix
root      6229  0.0  0.1  65940  1264 ?        S    00:11   0:00 /bin/sh /usr/local/bin/postfix_check.sh
root      6286  0.0  0.2  55060  2308 ?        Ss   00:11   0:00 /usr/libexec/postfix/master
postfix   6287  0.0  0.2  54232  2288 ?        S    00:11   0:00 pickup -l -t fifo -u
postfix   6288  0.0  0.2  54292  2344 ?        S    00:11   0:00 qmgr -l -t fifo -u
root      6292  0.0  0.0  65436   868 pts/1    R+   00:11   0:00 grep postfix


(9)試しにpostfixを落として10秒後に立ち上がるか確認

■start-stop-daemonのヘルプ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@example ~]# start-stop-daemon --help
start-stop-daemon 1.9.18 for Debian - small and fast C version written by
Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl>, public domain.

Usage:
  start-stop-daemon -S|--start options ... -- arguments ...
  start-stop-daemon -K|--stop options ...
  start-stop-daemon -H|--help
  start-stop-daemon -V|--version

Options (at least one of --exec|--pidfile|--user is required):
  -x|--exec <executable>        program to start/check if it is running
  -p|--pidfile <pid-file>       pid file to check
  -c|--chuid <name|uid[:group|gid]>
                change to this user/group before starting process
  -u|--user <username>|<uid>    stop processes owned by this user
  -n|--name <process-name>      stop processes with this name
  -s|--signal <signal>          signal to send (default TERM)
  -a|--startas <pathname>       program to start (default is <executable>)
  -N|--nicelevel <incr>         add incr to the process's nice level
  -b|--background               force the process to detach
  -m|--make-pidfile             create the pidfile before starting
  -R|--retry <schedule>         check whether processes die, and retry
  -t|--test                     test mode, don't do anything
  -o|--oknodo                   exit status 0 (not 1) if nothing done
  -q|--quiet                    be more quiet
  -v|--verbose                  be more verbose
Retry <schedule> is <item>|/<item>/... where <item> is one of
 -<signal-num>|[-]<signal-name>  send that signal
 <timeout>                       wait that many seconds
 forever                         repeat remainder forever
or <schedule> may be just <timeout>, meaning <signal>/<timeout>/KILL/<timeout>

Exit status:  0 = done      1 = nothing done (=> 0 if --oknodo)
              3 = trouble   2 = with --retry, processes wouldn't die


これで、簡単にスクリプトをdaemon化する事ができます。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中