Logstash Forwarder не запускается с помощью chkconfig в CentOS 5

Я установил logstash-forwarder на компьютере с CentOS 5, устанавливая его с этого RPM:

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

Когда я прошел через этот процесс, я обнаружил, что скрипт init, предоставленный для CentOS/RHEL/Fedora, не работает должным образом. При выполнении каких-либо команд я не получил никакой информации, и процесс не запустился. Я обнаружил, что у кого-то еще были похожие проблемы, и он написал их самостоятельно, этот сценарий работает нормально, когда я запускаю logstash-forwarder с помощью службы или команды init.d, однако я заметил, что при перезагрузке сервера служба не запустить (следующее только после перезагрузки):

# 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

Если я потом запускаю его вручную, все работает нормально. Некоторые исследования говорят мне, что у меня должен быть файл здесь (поскольку я использую уровень запуска 3):

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

Что находится на месте и за ним следует только smartd в числовом списке, так что я не думаю, что проблема в том, что службы, на которые опирается logstash-forwarder, еще не запущены. Может кто-нибудь посоветовать, как продолжить расследование, почему это не запускается?

РЕДАКТИРОВАТЬ

Я заметил, что эта проблема не проявляется в системе CentOS 6, только на компьютере CentOS 5. Я не уверен, какое это имеет значение, так как файлы шаблонов сценариев инициализации по сути одинаковы. Кто-нибудь?

ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ

Мне пришлось немного изменить скрипт инициализации, это было связано с тем, что я отправлял / var / log / messages на мой сервер logstash, но скрипт init заставлял журналы logstash переходить в сообщения, вызывая цикл обратной связи, каждый Когда он отправляет журнал в logstash, он добавляет журнал в сообщения, которые затем отправляются в logstash. Поэтому я немного изменил скрипт инициализации:

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

Этот скрипт отлично работает на CentOS 6, но когда я перезагружаюсь в CentOS 5, у меня была проблема, описанная выше, любая помощь будет принята с благодарностью.

ДРУГОЕ РЕДАКТИРОВАНИЕ

Я провел дополнительное тестирование и обнаружил, что при перезагрузке компьютера logstash-forwarder запускается, но файл logstash-forwarder.pid пуст, поэтому я полагаю, что скрипт init говорит, что он мертв только потому, что не может найти процесс как это не отмечено в файле pid. Следующее - сразу после перезагрузки:

# 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

Таким образом, похоже, что служба запускается, запись в файл pid не производится, перезапустите процесс. Я получаю 2 копии службы, работающей, так как она не убивает первый процесс, но при втором перезапуске оба процесса уничтожаются. и я вернулся к одному процессу.

Теперь мне нужно выяснить, почему запись файла pid не изменяется при загрузке компьютера.

2 ответа

Решение

Я закончил публикацией о проблеме на странице github для проекта, и я получил довольно быстрый ответ, указывающий мне на другую проблему, которая пришла вместе с другим сценарием инициализации, который я сейчас реализовал. Кажется, это работает правильно.

Благодаря TrevorH в IRC-канале CentOS за помощь, а также driskell на github за привлечение меня к новому скрипту инициализации, я скопирую его ниже для справки на случай, если у кого-то возникнет такая же проблема, как у меня с этим скриптом выше:

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

Это было немного изменено, так как исходный скрипт имел.conf в операторе DAEMON_ARGS, который не требовался в CentOS 5 или 6

РЕДАКТИРОВАТЬ

Были некоторые проблемы со скриптом инициализации, но коммитер обновил его сегодня, для моего экземпляра мне также понадобился любой из следующих файлов:

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

Содержание:

DAEMON_ARGS="${DAEMON_ARGS:--config /etc/logstash-forwarder/logstash-forwarder.conf -spool-size 100}" 

Похоже, что logstash-forwarder неправильно останавливается / уничтожается во время процесса выключения.

Пытались ли вы вручную переадресовать logstash с помощью сценария инициализации и посмотреть, сколько времени фактически требуется для полной остановки демона? Являются ли журналы, которые logstash-forwarder отслеживает на вашем компьютере CentOS 5, большие файлы журналов по сравнению с тем, что отслеживает ваш компьютер CentOS 6?

В качестве последнего средства вы можете передать SIGKILL для killproc, чтобы обеспечить остановку logstash-forwarder перед перезагрузкой.

killproc -p $PIDFILE -9
Другие вопросы по тегам