memcachedを複数起動する場合のinit.dの書き方

CentOS系でmemcachedを1つのサーバの中で複数起動したい場合ってありますよね。とくに開発サーバの場合は...もうね...

Twitter ツイート Hatena Bookmark ブックマーク

CentOS系でmemcachedを1つのサーバの中で複数起動したい場合ってありますよね。
とくに開発サーバの場合は…もうね…

んで、/etc/init.d/memcachedをコピーして/etc/init.d/memcached2でもつくって設定入れ替えればいいとおもいました。
でもなぜかコピペしてもうまくいかなかった…

もう諦めてたところで、弊社の優秀なエンジニアが/etc/init.d/memcached2でmemcachedのインスタンスが起動しない理由を突き止めてくれました!
原因は/etc/sysconfig/memcachedをmemcached2で読んでしまっていただけなんですが・・・

もうね、気づけよと…動くようにしてもらって嬉しかったけど、自分のコード読む力にがっかりしてしまいました。

でもよーく考えたら今後、また別でmemcached立ち上げたいときにcpしてmemcached3とかmemcached4とか増やして行くのはイケないよね?
ってことで、シェルスクリプトになれる意味合いも込めて簡単にmemcachedを複数起動できるように起動スクリプトを修正しました。

/etc/init.d/memcached

  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
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
#! /bin/sh
#
# chkconfig: - 55 45
# description:  The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# pidfile: /var/run/memcached/memcached.pid

# Standard LSB functions
#. /lib/lsb/init-functions

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

PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=64
OPTIONS=""

if [ -f /etc/sysconfig/memcached ];then
    . /etc/sysconfig/memcached
fi

# Check that networking is up.
. /etc/sysconfig/network

if [ "$NETWORKING" = "no" ]
then
    exit 0
fi


RETVAL=0
prog="memcached"
pidfile=${PIDFILE-/var/run/memcached/memcached.pid}
lockfile=${LOCKFILE-/var/lock/subsys/memcached}

## 追記個所 ##
if [ $# -eq 2 ] ; then
    if [ `echo $2|grep -c '[2-9][0-9]*'` -eq 1 ] ; then

        if [ -f /etc/sysconfig/memcached${2} ];then
            . /etc/sysconfig/memcached${2}
        else
            PORT=`expr $PORT + $2`
        fi  

        pidfile=${PIDFILE-/var/run/memcached/memcached${2}.pid}
        lockfile=${LOCKFILE-/var/lock/subsys/memcached}${2}
    fi  
fi


start () {
    echo -n $"Starting $prog: port $PORT"
    # Ensure that /var/run/memcached has proper permissions
    if [ "`stat -c %U /var/run/memcached`" != "$USER" ]; then
        chown $USER /var/run/memcached
    fi  

    daemon --pidfile ${pidfile} memcached -d -p $PORT -u $USER  -m $CACHESIZE -c $MAXCONN -P ${pidfile} $OPTIONS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop () {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} /usr/bin/memcached
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ] ; then
        rm -f ${lockfile} ${pidfile}
    fi
}

restart () {
        stop
        start
}


# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status -p ${pidfile} memcached
    RETVAL=$?
    ;;
  restart|reload|force-reload)
    restart
    ;;
  condrestart|try-restart)
    [ -f ${lockfile} ] && restart || :
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
    RETVAL=2
        ;;
esac

exit $RETVAL  

「## 追記個所 ##」とコメントがついている部分を見れば分かると思いますが、一応使い方はこんな感じです。

1つめ起動

/etc/init.d/memcached start

2つめ起動…

/etc/initd.d/memcached start 2

3台目起動…

/etc/initd.d/memcached start 3

実際に動いているか見てみる

1
2
3
4
5
[polidog@www]~% ps aux | grep memcached
103      27513  0.0  0.0  69004   768 ?        Ssl  04:15   0:00 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid
103      27661  0.0  0.0  69004   768 ?        Ssl  04:20   0:00 memcached -d -p 11214 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached3.pid
103      27690  0.0  0.0 199772   788 ?        Ssl  04:20   0:00 memcached -d -p 11222 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached2.pid
polidog  28611  0.0  0.0  65412   824 pts/0    S+   04:41   0:00 grep memcached

てな具合に2番目の引数に数値を渡してあげればいいだけです。
デフォルトだと/etc/sysconfig/memcachedに記載されているポート番号に第二引数の数値を足したものがポート番号になります。
ただ、明らかに違うポートとかメモリ量を変更したい場合は、「/etc/sysconfig/memcached2」とか第二引数の番号にあわせたファイルを作っていただいて、そこに設定書けば細かく調整できます!

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。