Я устанавливаю сервер memcached через исходный код и могу получить стандартный скрипт запуска, установленный для 1 экземпляра сервера memcached, но, пробуя несколько скриптов через Google, не могу найти тот, который работает для управления автоматическим запуском при загрузке для нескольких экземпляров сервера memcached. Я пробовал оба эти скрипта, и оба не работают, service memcached start просто возвращается в командную строку без запущенных экземпляров сервера memcached
- lullabot.com/articles/installing-memcached-redhat-or-centos
- addmoremem.blogspot.com/2010/09/running-multiple-instances-of-memcached.html
Однако этот bash-скрипт работает, но не запускает экземпляры memcached при запуске?
#!/bin/sh
case "$1" in
start)
/usr/local/bin/memcached -d -m 16 -p 11211 -u nobody
/usr/local/bin/memcached -d -m 16 -p 11212 -u nobody
;;
stop) killall memcached
;;
esac
ОС: Centos 5.5 64bit Memcached = v1.4.5 Memcache = v2.2.5
Кто-нибудь может указать мне рабочий скрипт запуска /etc/init.d/ для управления несколькими серверами memcached? Спасибо
правка: Спасибо, Мэт, это код, который в итоге заработал
#!/bin/sh
# chkconfig: - 80 12
# description: The memcached daemon is a network memory cache service.
# processname: memcached
BIN=/usr/local/bin/memcached
USER=nobody
CON=2048
THREADS=4
$BIN -d -m 16 -p 11211 -c $CON -t $THREADS -u $USER
$BIN -d -m 16 -p 11212 -c $CON -t $THREADS -u $USER
case "$1" in
start)
$BIN -d -m 16 -p 11211 -c $CON -t $THREADS -u $USER
$BIN -d -m 16 -p 11212 -c $CON -t $THREADS -u $USER
;;
stop) killall $BIN
;;
esac
решение1
Чтобы добавить службу в chkconfig, вам обычно понадобится несколько специальных комментариев под кодом скрипта оболочки:
#!/bin/sh
# chkconfig: - 55 45
# description: The memcached daemon is a network memory cache service.
# processname: memcached
После добавления строк в /etc/init.d/memcached вы можете выполнить команду
chkconfig --add memcached
Конечно, существуют дополнительные уровни запуска, на которых может начаться процесс, поэтому для проверки вам следует выдать
chkconfig --list | grep "memcached"
Обычный уровень запуска для memcached будет следующим:
chkconfig --level 345 memcached on
решение2
Вот скрипт, который я использую для запуска нескольких экземпляров memcached. Ключевой момент в том, что я использую ассоциативный массив для запуска всех или только одного конкретного экземпляра:
#! /usr/local/bash4/bin/bash
#
# chkconfig: - 55 45
# description: The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# Standard LSB functions
#. /lib/lsb/init-functions
# Source function library.
. /etc/init.d/functions
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
typeset -A PIDS
typeset -A MEMORYS
typeset -A FACTORS
typeset -A INSTANCES
PORTS="11216 11217"
USER=memcached
basedir="/usr/local/memcached"
MAXCONN=1024
OPTIONS=""
INSTANCES=([11216]="session" [11217]="userdata")
PIDS=([11216]="$basedir/var/run/sohaphimdetails.pid" [11217]="$basedir/var/run/sohamuzik-top.pid")
MEMORYS=([11216]="1024" [11217]="2048")
FACTORS=([11216]="1.25" [11217]="1.125")
RETVAL=0
prog="memcached"
cmd="/usr/local/memcached/bin/memcached"
user="memcached"
ip="192.168.6.66"
peer="192.168.6.28"
max_conn=2048
max_memory=512
threads=8
function start()
{
port="$1"
if [ `ps -ef | grep "$cmd" | grep -c $port` -ge 1 ]; then
action $"Starting the memcached server on port '$port'... " /bin/false
else
if [ ! -f $basedir/var/log/${INSTANCES[$port]}.log ]; then
touch $basedir/var/log/${INSTANCES[$port]}.log
/bin/chown memcached:memcached $basedir/var/log/${INSTANCES[$port]}.log
fi
$cmd -d -u $user -l $ip -c $max_conn -t $threads -m ${MEMORYS[$port]} -p $port -P $basedir/var/run/${INSTANCES[$port]}.pid -f ${FACTORS[$port]} -x $peer -X `expr $port '*' 10` -vv > $basedir/var/log/${INSTANCES[$port]}.log 2>&1
action $"Starting the memcached server on port '$port'... " /bin/true
fi
}
function stop()
{
port="$1"
if [ `ps -ef | grep "$cmd" | grep -c $port` -eq 0 ]; then
action $"Stopping the memcached server on port '$port'... " /bin/false
else
kill -TERM `ps -ef | grep "$cmd" | grep $port | grep -v grep | awk '{ print $2 }'`
action $"Stopping the memcached server on port '$port'... " /bin/true
fi
}
case "$1" in
start)
if [ -n "$2" ]; then
start $2
else
for port in $PORTS; do
start $port
done
fi
;;
stop)
if [ -n "$2" ]; then
port="$2"
stop $port
else
killproc $prog
fi
;;
restart)
if [ -n "$2" ]; then
stop $2
start $2
else
for port in $PORTS; do
stop $port
start $port
done
fi
;;
*)
printf 'Usage: %s {start|stop|restart} <port>\n' "$prog"
exit 1
;;
esac
PS: Я использовалзаменендля репликации.
решение3
Поскольку скрипт работает, я предполагаю, что он не связан с /etc/rc.d, поэтому он не выполняется при запуске. Предполагая, что ваш скрипт запуска называется /etc/init.d/memcached, вы должны выполнить
chkconfig --add memcached
чтобы добавить его в список скриптов, запускаемых при запуске.