Amazon Linux Init.d 脚本未正确守护进程

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

答案1

我发现问题在于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 $!"
}

答案2

我刚刚研究过这个问题,并根据 Josh 的上述解决方案创建了一个解决方案。它通过使用 chkconfig 标头来解决“sleep 10”问题,该标头确保脚本在尝试启动之前等待合适的服务可用。这是我的 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

相关内容