Скрипт Amazon Linux Init.d неправильно демонизируется

Я работаю над Amazon Linux и столкнулся с проблемой с моим скриптом init.d. Я пытаюсь запустить Kibana 4, который является просто сценарием, который вызывает nodejs для запуска в качестве службы, но он не работает.

Typing 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

2 ответа

Решение

Я понял, что проблема в том, что 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 $!"
}

Я только что рассмотрел эту проблему и создал решение, основанное на рассуждениях Джоша. Он обходит проблему "сна 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, log и pid и т. Д.:

sudo chmod 0755 /etc/init.d/kibana
sudo chkconfig kibana on
Другие вопросы по тегам