Múltiplo script de inicialização /etc/init.d do servidor Memcached que funciona?

6

Eu instalo o servidor memcached via source e posso obter o script de inicialização padrão instalado para uma instância do servidor memcached, mas tentando vários scripts via google, não consigo encontrar um que funcione para inicialização automática do gerenciador na inicialização de várias instâncias do servidor memcached. Eu tentei ambos os scripts e ambos não funcionam, o serviço memcached start apenas retorna ao prompt de comando sem nenhuma instância do servidor de memcached iniciada

  • lullabot.com/articles/installing-memcached-redhat-or-centos
  • addmoremem.blogspot.com/2010/09/running-multiple-instances-of-memcached.html

No entanto, esse script bash funciona, mas não inicia instâncias do memcached na inicialização?

#!/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

OS: Centos 5.5 64bit Memcached = v1.4.5 Memcache = v2.2.5

Alguém pode me indicar um script de inicialização /etc/init.d/ para gerenciar vários servidores memcached? Obrigado

edit: Obrigado, este é o código que acabou funcionando

#!/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
    
por p4guru 23.12.2010 / 15:14

3 respostas

5

Para adicionar um serviço ao chkconfig, você normalmente precisará de alguns comentários especiais abaixo do shebang de um shell script:

#!/bin/sh
# chkconfig: - 55 45
# description:  The memcached daemon is a network memory cache service.
# processname: memcached

Depois de adicionar as linhas ao /etc/init.d/memcached, você pode emitir

chkconfig --add memcached

Existem, é claro, níveis de execução adicionais em que um processo pode ser iniciado para verificar se você emitiria

chkconfig --list | grep "memcached"

Um nível de execução comum para o memcached seria

chkconfig --level 345 memcached on
    
por 23.12.2010 / 16:06
1

Aqui está o script que estou usando para iniciar várias instâncias do memcached. O ponto-chave é usar array associativo para iniciar tudo ou apenas uma instância específica:

#! /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: usei repcached para replicação.

    
por 15.02.2012 / 06:12
0

Como o script está funcionando, presumo que não esteja vinculado a partir do /etc/rc.d, portanto, ele não é executado na inicialização. Assumindo que seu script de inicialização é chamado /etc/init.d/memcached, você deve executar

chkconfig --add memcached

para adicioná-lo à lista de scripts a serem executados na inicialização.

    
por 23.12.2010 / 15:58