Назад | Перейти на главную страницу

Сценарий Amazon Linux Init.d не демонизируется должным образом

Я работаю над 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 $!"
}