我已经在 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