Я работаю над Amazon Linux, и у меня возникла проблема с моим скриптом init.d. Я пытаюсь запустить Kibana 4, который представляет собой просто сценарий, вызывающий nodejs для запуска в качестве службы, но он не работает.
Печатать service kibana status
работает нормально, но всякий раз, когда я набираю service kibana start
команда просто зависает (т.е. не работает в фоновом режиме). Когда я Ctrl-C
это я получаю [FAILED]
ответ, но процесс создан и выполняется.
Когда я смотрю в свой /var/run/
каталог для kibana.pid
Я ничего не вижу, хотя процесс действительно запущен. Может ли кто-нибудь помочь мне понять, что я делаю не так?
У меня такое чувство, что я не использую daemon
правильно...
#!/bin/bash
#
# /etc/init.d/kibana
# Set defaults.
exec="/kibana/kibana-{{ kibana.version }}-linux-x64/bin/kibana > /var/log/kibana/kibana.log"
prog="kibana"
pid_file="/var/run/${prog}.pid"
lock_file="/var/lock/subsys/$prog"
kibana_user="kibana"
# Execute init.d functions
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo -n "Start Kibana: "
daemon --user $kibana_user --pidfile $pid_file $exec
retval=$?
echo
[ $retval -eq 0 ] && touch $lock_file
;;
stop)
echo -n "Stopping Kibana: "
su $kibana_user -c "kill `cat $pid_file`"
retval=$?
[ $retval -eq 0 ] && rm -f $lock_file
echo "OK"
;;
status)
status -p $pid_file kibana
exit $?
;;
*)
echo "Usage: `basename $0` start|stop|status"
exit 1
esac
exit 0
Я только что рассмотрел эту проблему и создал решение на основе приведенного выше Джоша. Проблема «сна 10» решается с помощью заголовка chkconfig, который гарантирует, что сценарий ожидает доступности подходящих сервисов перед попыткой запуска. Вот мой сценарий init.d:
#!/bin/bash
#
# Kibana Init script for Kibana
#
# chkconfig: 345 99 76
# processname: kibana
#
KIBANA_EXEC="/opt/kibana/bin/kibana"
now=$(date +"%Y-%m-%d-%S")
LOG_FILE="/opt/kibana/bin/log/kibana.$now.log"
PID_FILE="/opt/kibana/bin/log/kibana.$now.pid"
RETVAL=0
start() {
echo "Starting Kibana..."
$KIBANA_EXEC 1>"$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "Kibana started with pid $!"
}
case "$1" in
start)
start
;;
*)
echo "Usage: $0 {start}"
exit 0
;;
esac
exit $RETVAL
Затем вам нужно будет обновить разрешения сценария и зарегистрировать службу (не забудьте создать подходящий каталог для ведения журнала и установить правильные пути для местоположения kibana, журнала и pid и т. Д .:
sudo chmod 0755 /etc/init.d/kibana
sudo chkconfig kibana on
Я понял, что проблема в том, что daemon
не играл хорошо с exec
. Я обновил свой код, чтобы позвонить kibana
прямо и добавил &
в конце, чтобы заставить его демонизировать.
Обновить:
К сожалению, я не могу скопировать полный код, который использовал, но могу сказать вам, что я основал его на https://github.com/chovy/node-startup. Я в основном разветвил этот код и внес изменения, которые имели смысл для моей установки.
Вот ключевая функция моего сценария init.d:
KIBANA_EXEC="/path/to/my/kibana/bin"
LOG_FILE="/path/to/kibana/log/file"
PID_FILE="/path/to/kibana/pid/file"
...
start_it() {
mkdir -p "$PID_DIR"
mkdir -p "$LOG_DIR"
# This is an artifact of the way I set things up and is a hacky solution to
# fix a race condition, so copy with caution
sleep 10
echo "Starting Kibana..."
$KIBANA_EXEC 1>"$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "Kibana started with pid $!"
}