在 CentOS 5 中,Logstash Forwarder 无法使用 chkconfig 启动

在 CentOS 5 中,Logstash Forwarder 无法使用 chkconfig 启动

我已经在 CentOS 5 机器上设置了 logstash-forwarder,并从此 RPM 安装它:

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

当我完成这个过程时,我发现为 CentOS/RHEL/Fedora 提供的 init 脚本没有按预期工作。我在运行任何命令时没有收到任何反馈信息,它也没有启动该过程。我发现其他人也遇到了类似的问题,并且自己写的当我使用服务或 init.d 命令启动 logstash-forwarder 时,此脚本运行正常,但是,我注意到,当我重新启动服务器时,该服务没有启动(以下是重启后的情况):

# 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 机器上出现。我不确定这有什么区别,因为 init 脚本模板文件本质上是相同的。有人知道吗?

进一步编辑

我不得不稍微修改一下 init 脚本,这只是因为我将 /var/log/messages 发送到我的 logstash 服务器,但 init 脚本让 logstash 日志进入消息,从而导致反馈循环,每次它向 logstash 发送日志时,它都会将日志添加到消息中,然后将其发送到 logstash。所以我稍微修改了 init 脚本:

#! /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 文件条目没有改变。

答案1

我最终在github 页面对于这个项目,我得到了相当快的回复,指导我另一个问题它随另一个初始化脚本一起提供,我现在已经实现了它。它似乎工作正常。

感谢 CentOS IRC 频道的 TrevorH 的帮助,以及德里斯克尔在 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 $?

这已略作修改,因为原始脚本在 DAEMON_ARGS 语句中有 .conf,而在 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}" 

答案2

听起来 logstash-forwarder 在关闭过程中没有被正确停止/杀死。

您是否尝试过使用 init 脚本手动运行 logstash-forwarder,并查看守护进程完全停止实际需要多长时间?logstash-forwarder 在您的 CentOS 5 机器中跟踪的日志是否比您的 CentOS 6 机器跟踪的日志大?

作为最后的手段,您可以将 SIGKILL 传递给 killproc 以确保 logstash-forwarder 在重启之前停止。

killproc -p $PIDFILE -9

相关内容