Я установил logstash-forwarder на машине CentOS 5, установив его из этого RPM:
http://download.elasticsearch.org/logstash-forwarder/packages/logstash-forwarder-0.3.1-1.x86_64.rpm
Когда я прошел через процесс, я обнаружил, что сценарий инициализации, предоставленный для 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, но сценарий инициализации заставлял журналы 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 пуст, поэтому я предполагаю, что сценарий инициализации говорит, что он мертв только потому, что не может найти процесс поскольку это не указано в файле 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 не изменяется при загрузке машины.
В итоге я написал о проблеме в страница github для проекта, и я получил довольно быстрый ответ, указывающий на другая проблема вместе с другим сценарием инициализации, который я реализовал. Кажется, это работает правильно.
Спасибо TrevorH из IRC-канала CentOS за помощь, а также Дрискелл на 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-forwarder с помощью сценария инициализации и посмотреть, сколько времени на самом деле требуется для полной остановки демона? Являются ли журналы, которые logstash-forwarder отслеживает на вашем компьютере CentOS 5, большими файлами журнала по сравнению с тем, что отслеживает ваш компьютер CentOS 6?
В крайнем случае вы можете передать SIGKILL в killproc, чтобы гарантировать остановку logstash-forwarder перед перезагрузкой.
killproc -p $PIDFILE -9