我已经在CentOS 5机器上安装logstash-forwarder,从这个RPM安装它:
http://download.elasticsearch.org/logstash-forwarder/packages/logstash-forwarder-0.3.1-1.x86_64.rpm
当我经历这个过程时,我发现为CentOS / RHEL / Fedora提供的初始化脚本没有按预期工作。 运行任何命令时,我都没有得到任何反馈给我的信息,也没有启动这个过程。 我发现别人有类似的问题,并写了自己的 , 这个脚本工作正常,当我启动logstash转发使用服务或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依赖的服务已经不被启动了。 任何人都可以build议如何进一步调查为什么这不是启动?
编辑
我注意到这个问题在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中重新启动时,我遇到了上面解释的问题,任何帮助都将不胜感激。
另一个编辑
我做了一些进一步的testing,发现当我重启机器时,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文件中没有进入,重新启动进程,我得到两个副本的服务运行,因为它不杀死第一个进程,但第二次重新启动它,这两个进程都被杀死我又回到了一个过程。
现在我需要弄清楚为什么启动机器时pid文件没有被改变。
最后我在github页面上发布了关于这个问题的post,我得到了相当迅速的回应,指出另一个与我现在实现的init脚本一起出现的问题 。 这似乎工作正常。
感谢CentOS IRC渠道中的TrevorH ,以及github上的driskell ,让我可以看到新的init脚本,下面我将复制它以供参考,以防有人遇到同样的问题:
#!/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}"
听起来像logstash-forwarder在关机过程中没有正确停止/杀死。
您是否使用init脚本手动尝试logstash-forwarder,并查看守护进程完全停止需要多长时间? 日志logstash-forwarder是否正在跟踪CentOS 5机器中的大型日志文件,与您的CentOS 6机器正在跟踪的内容相比较?
作为最后的手段,您可以传递一个SIGKILL killproc以确保logstash-forwarder在重新启动之前停止。
killproc -p $PIDFILE -9