O Logstash Forwarder não inicia com o chkconfig no CentOS 5

3

Eu configurei o logstash-forwarder em uma máquina do CentOS 5 instalando-o a partir deste RPM:

http://download.elasticsearch.org/logstash-forwarder/packages/logstash-forwarder-0.3.1-1.x86_64.rpm

Quando eu passei pelo processo, descobri que o script init fornecido para o CentOS / RHEL / Fedora não funcionava como esperado. Eu não recebi nenhuma informação de volta para mim quando executando qualquer comando e ele não iniciou o processo. Eu encontrei alguém que teve alguns problemas semelhantes e tinha escrito o seu próprio , este script funciona bem quando eu inicio logstash-forwarder usando o serviço ou o comando init.d, no entanto, tenho notado que quando eu reiniciar o servidor o serviço não é iniciado (o seguinte é de logo após uma reinicialização):

# service logstash-forwarder status
logstash-forwarder dead but pid file exists

# chkconfig --list logstash-forwarder
logstash-forwarder      0:off   1:off   2:off   3:on    4:on    5:on    6:off

Se eu iniciar manualmente, tudo funciona bem. Alguma pesquisa me disse que eu deveria ter um arquivo aqui (como eu uso o nível de execução 3):

# ls -la /etc/rc3.d/ | grep logstash
lrwxrwxrwx  1 root root   28 Nov  5 12:33 S99logstash-forwarder -> ../init.d/logstash-forwarder

O que está em vigor e é seguido apenas por smartd na lista numérica, portanto, não acho que o problema seja que os serviços nos quais o logstash-forwarder se baseia não estejam ativados. Alguém pode aconselhar quanto mais investigar por que isso não está sendo iniciado?

EDITAR

Eu notei que este problema não é aparente em um sistema CentOS 6, apenas em uma máquina CentOS 5. Não tenho certeza de qual diferença isso faz, pois os arquivos de modelo de script de inicialização são essencialmente os mesmos. Alguém?

EDIÇÃO ADICIONAL

Eu tive que modificar um pouco o script init, isso foi apenas para o fato de eu estar enviando / var / log / messages para o meu servidor logstash, mas o script init fez os logs do logstash entrarem nas mensagens, causando um feedback loop, toda vez que ele enviasse um log para logstash ele adicionaria um log a mensagens, que seriam então enviadas para logstash. Então eu mudei o script de inicialização ligeiramente:

#! /bin/sh
#
# chkconfig: 345 99 99
# description: logstash-forwarder
# processname: logstash-forwarder
# config: /etc/logstash-forwarder

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

NAME=logstash-forwarder
DESC="log shipper"
PATH=/sbin:/usr/sbin:/bin:/usr/bin
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
DAEMON=/opt/logstash-forwarder/bin/logstash-forwarder
DAEMON_ARGS="-config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100"

start() {
        echo -n "Starting $NAME: "
        daemon --pidfile $PIDFILE "nohup $DAEMON $DAEMON_ARGS >/dev/null 2>&1 &"
        touch /var/lock/subsys/$NAME
        echo $(pidofproc $NAME) > $PIDFILE
        echo
        return 0
}

stop() {
        echo -n "Shutting down $NAME: "
        killproc -p $PIDFILE
        rm -f /var/lock/subsys/$NAME
        echo
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status -p $PIDFILE $NAME
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: service $NAME {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $?

Este script funciona perfeitamente no CentOS 6, mas quando eu reinicio no CentOS 5 eu tenho o problema explicado acima, qualquer ajuda seria muito apreciada.

OUTRA EDIÇÃO

Eu fiz mais alguns testes, e descobri que quando eu reinicializo a máquina logstash-forwarder é inicializada, mas o arquivo logstash-forwarder.pid está vazio, então eu acho que o script de inicialização está dizendo que está morto só porque não pode encontre o processo como não está anotado no arquivo pid. O seguinte é diretamente depois de uma reinicialização:

# service logstash-forwarder status
logstash-forwarder dead but pid file exists
# ps -ef | grep logstash
root      3297     1  2 10:20 ?        00:00:02 /opt/logstash-forwarder/bin/logstash-forwarder -config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100 -log-to-syslog
root      3722  3324  0 10:22 pts/0    00:00:00 grep logstash
# cat /var/run/logstash-forwarder.pid

# service logstash-forwarder restart
Shutting down logstash-forwarder:                          [FAILED]
Starting logstash-forwarder:                               [  OK  ]
# cat /var/run/logstash-forwarder.pid
3748 3297
# ps -ef | grep logstash
root      3297     1  2 10:20 ?        00:00:03 /opt/logstash-forwarder/bin/logstash-forwarder -config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100 -log-to-syslog
root      3748     1  1 10:22 pts/0    00:00:00 /opt/logstash-forwarder/bin/logstash-forwarder -config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100 -log-to-syslog
root      3767  3324  0 10:22 pts/0    00:00:00 grep logstash
# service logstash-forwarder restart
Shutting down logstash-forwarder:                          [  OK  ]
Starting logstash-forwarder:                               [  OK  ]
# ps -ef | grep logstash
root      3788     1  5 10:22 pts/0    00:00:00 /opt/logstash-forwarder/bin/logstash-forwarder -config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100 -log-to-syslog
root      3796  3324  0 10:22 pts/0    00:00:00 grep logstash
# cat /var/run/logstash-forwarder.pid
3788

Então parece que o serviço é iniciado, nenhuma entrada é feita no arquivo pid, reinicie o processo recebo 2 cópias do serviço em execução, pois ele não mata o primeiro processo, mas a segunda vez que eu reinicio os dois processos são mortos e eu estou de volta a ter um processo.

Agora, preciso descobrir por que a entrada do arquivo pid não é alterada quando eu inicializo a máquina.

    
por Rumbles 05.11.2014 / 14:15

2 respostas

2

Acabei postando sobre o assunto na página do github para o projeto, e fiquei bastante uma resposta rápida me apontando para outro problema que veio junto com outro script de init, que eu já implementei. Isso parece funcionar corretamente.

Graças a TrevorH no canal CentOS IRC para a assistência, bem como driskell no github para me levar ao novo script de init, Vou copiá-lo abaixo para referência no caso de alguém ter o mesmo problema que eu tenho com o script acima:

#!/bin/bash
# chkconfig: 345 80 20
# description: Logstash Forwarder
# processname: logstash-forwarder
# config: /etc/logstash-forwarder
# pidfile: /var/run/logstash-forwarder.pid

### BEGIN INIT INFO
# Provides: logstash-forwarder
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop logstash-forwarder
# Description: Logstash Forwarder
### END INIT INFO

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

PATH=/sbin:/usr/sbin:/bin:/usr/bin

prog=logstash-forwarder
DAEMON=/opt/logstash-forwarder/bin/logstash-forwarder
pidfile=/var/run/$prog.pid
lockfile=/var/lock/subsys/$prog

# load defaults

[ -e /etc/default/$prog ] && . /etc/default/$prog
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

DAEMON_ARGS="${DAEMON_ARGS:--config /etc/logstash-forwarder -spool-size 100 -log-to-syslog}"

start()
{
    echo -n $"Starting $prog: "
    nohup $DAEMON $DAEMON_ARGS </dev/null >/dev/null 2>&1 &
    retval=$?
    pid=$!
    echo $pid > $pidfile
    if [ rh_status_q ]; then
        touch $lockfile
        success
        echo
    fi
    return $retval
}

stop()
{
    echo -n $"Stopping $prog: "
    killproc -p "$pidfile" $prog
    retval=$?
    [ -f "$pidfile" ] && rm -f $pidfile
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    stop
    start
}

reload() {
    restart
}

force_reload() {
    restart
}

rh_status() {
    status -p $pidfile $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    status)
        rh_status
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

Isso foi modificado um pouco, pois o script original tinha .conf na instrução DAEMON_ARGS, que não era necessária no CentOS 5 ou 6

EDITAR

Houve alguns problemas com o script de inicialização, mas o commiter o atualizou hoje. Na minha instância, eu também precisei dos seguintes arquivos:

/etc/defaults/logstash-forwarder
/etc/sysconfig/logstash-forwarder

Conteúdo:

DAEMON_ARGS="${DAEMON_ARGS:--config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100}" 
    
por 06.11.2014 / 13:00
1

Parece que o encaminhador de logstash não está sendo interrompido / morto corretamente durante o processo de desligamento.

Você tentou manualmente fazer o logstash-forwarder usando o script de inicialização e ver quanto tempo leva para o daemon ser totalmente interrompido? Os logs que o logstash-forwarder está rastreando em sua máquina do CentOS 5, arquivos de log grandes comparados com o que sua máquina do CentOS 6 está rastreando?

Como último recurso, você pode passar um SIGKILL para killproc para garantir que o logstash-forwarder pare antes da reinicialização.

killproc -p $PIDFILE -9
    
por 06.11.2014 / 01:12