![Amazon Linux Init.d 脚本未正确守护进程](https://linux22.com/image/652446/Amazon%20Linux%20Init.d%20%E8%84%9A%E6%9C%AC%E6%9C%AA%E6%AD%A3%E7%A1%AE%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B.png)
我正在使用 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