我看到 zookeeper 的开发人员有一个很棒的 zkServer.sh 脚本来启动、停止、重新启动等 zookeeper,但我不知道他们为什么决定跳过使用 init 脚本。
例如,使用 zkServer.sh 脚本无法将 zookeeper 设置为在服务器启动时运行。
那么有人知道如何包装或使用可用且正常工作的 zookeeper 初始化脚本吗?
这是 zkServer.sh 文件的链接https://github.com/apache/zookeeper/blob/master/bin/zkServer.sh
感谢您的帮助
这是我的示例初始化脚本,我只需要一些帮助进行调整
#!/bin/bash
#
# /etc/init.d/zookeeper
#
# Startup script for Zookeeper
#
# chkconfig: 2345 80 20
# description: Starts and stops Zookeeper
# pidfile: /var/run/zookeeper/zookeeper.pid
### BEGIN INIT INFO
# Provides: zookeeper
# Required-Start: $remote_fs $network $named $time
# Required-Stop: $remote_fs $network $named $time
# Should-Start: ntp mdadm
# Should-Stop: ntp mdadm
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: distributed storage system for structured data
# Description: Zookeeper is a distributed (peer-to-peer) system for
# the management and storage of structured data.
### END INIT INFO
. /etc/rc.d/init.d/functions
#export ZK_HOME=/usr/share/zookeeper
#export ZK_CONF=/etc/zookeeper/conf
#export ZK_INCLUDE=$ZK_HOME/zookeeper.in.sh
export ZK_HOME=/zookeeper/opt/zookeeper
export ZK_CONF=/zookeeper/opt/zookeeper/conf
export ZK_INCLUDE=$ZK_HOME/bin/zookeeper.in.sh
#export ZK_OWNR=zookeeper
export ZK_OWNR=root
NAME="zookeeper"
log_file=/var/log/zookeeper/zookeeper.log
pid_file=/var/run/zookeeper/zookeeper.pid
lock_file=/var/lock/subsys/$NAME
#ZK_PROG=/usr/sbin/zookeeper
ZK_PROG=/zookeeper/opt/zookeeper/bin/zkServer.sh
# The first existing directory is used for JAVA_HOME if needed.
JVM_SEARCH_DIRS="/usr/lib/jvm/jre /usr/lib/jvm/jre-1.7.* /usr/lib/jvm/java-1.7.*/jre"
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# If JAVA_HOME has not been set, try to determine it.
if [ -z "$JAVA_HOME" ]; then
# If java is in PATH, use a JAVA_HOME that corresponds to that. This is
# both consistent with how the upstream startup script works, and with
# the use of alternatives to set a system JVM (as is done on Debian and
# Red Hat derivatives).
java="`/usr/bin/which java 2>/dev/null`"
if [ -n "$java" ]; then
java=`readlink --canonicalize "$java"`
JAVA_HOME=`dirname "\`dirname \$java\`"`
else
# No JAVA_HOME set and no java found in PATH; search for a JVM.
for jdir in $JVM_SEARCH_DIRS; do
if [ -x "$jdir/bin/java" ]; then
JAVA_HOME="$jdir"
break
fi
done
# if JAVA_HOME is still empty here, punt.
fi
fi
JAVA="$JAVA_HOME/bin/java"
export JAVA_HOME JAVA
case "$1" in
start)
# Zookeeper startup
echo -n "Starting Zookeeper: "
[ -d `dirname "$pid_file"` ] || \
install -m 755 -o $ZK_OWNR -g $ZK_OWNR -d `dirname $pid_file`
$ZK_PROG start /zookeeper/opt/zookeeper/conf/zoo.cfg $ZK_CONF -p $pid_file > $log_file 2>&1
retval=$?
[ $retval -eq 0 ] && touch $lock_file
echo "OK"
;;
stop)
# Zookeeper shutdown
echo -n "Shutdown Zookeeper: "
kill `cat $pid_file`
retval=$?
[ $retval -eq 0 ] && rm -f $lock_file
for t in `seq 40`; do
status -p $pid_file zookeeper > /dev/null 2>&1
retval=$?
if [ $retval -eq 3 ]; then
echo "OK"
exit 0
else
sleep 0.5
fi;
done
# Adding a sleep here to give jmx time to wind down (ZK-4483). Not ideal...
# Adam Holmberg suggests this, but that would break if the jmx port is changed
# for t in `seq 40`; do netstat -tnlp | grep "0.0.0.0:7199" > /dev/null 2>&1 && sleep 0.1 || break; done
sleep 5
status -p $pid_file zookeeper > /dev/null 2>&1
retval=$?
if [ $retval -eq 3 ]; then
echo "OK"
else
echo "ERROR: could not stop $NAME"
exit 1
fi
;;
reload|restart)
$0 stop
$0 start
;;
status)
status -p $pid_file zookeeper
exit $?
;;
*)
echo "Usage: `basename $0` start|stop|status|restart|reload"
exit 1
esac
exit 0
现在的问题是,如果我这样做,service zookeerper start
它永远不会完成,如果我从另一个终端会话查看正在运行的 zookeeper 服务,我会看到其中 3 个...当我这样做时,service zookeeper status
我得到以下信息
● zookeeper.service - LSB: distributed storage system for structured data
Loaded: loaded (/etc/rc.d/init.d/zookeeper; bad; vendor preset: disabled)
Active: failed (Result: timeout) since Thu 2017-08-24 18:11:00 UTC; 2min 3s ago
Docs: man:systemd-sysv-generator(8)
Process: 19673 ExecStart=/etc/rc.d/init.d/zookeeper start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/zookeeper.service
└─19691 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.el7_4.x86_64/jre/bin/java -Dzookeeper.log.dir=. -Dzookeepe...
Aug 24 18:06:00 10.34.227.131 systemd[1]: Starting LSB: distributed storage system for structured data...
Aug 24 18:06:01 10.34.227.131 zookeeper[19673]: Starting Zookeeper: OK
Aug 24 18:06:01 10.34.227.131 systemd[1]: PID file /var/run/zookeeper/zookeeper.pid not readable (yet?) after start.
Aug 24 18:11:00 10.34.227.131 systemd[1]: zookeeper.service start operation timed out. Terminating.
Aug 24 18:11:00 10.34.227.131 systemd[1]: Failed to start LSB: distributed storage system for structured data.
Aug 24 18:11:00 10.34.227.131 systemd[1]: Unit zookeeper.service entered failed state.
Aug 24 18:11:00 10.34.227.131 systemd[1]: zookeeper.service failed.
答案1
这就是有效的方法
# ZooKeeper install path (where you extracted the tarball)
ZOOKEEPER='/zookeeper/opt/zookeeper'
ZOOUSER=root
source /etc/rc.d/init.d/functions
source $ZOOKEEPER/bin/zkEnv.sh
RETVAL=0
PIDFILE="/var/run/zookeeper/zookeeper.pid"
desc="ZooKeeper daemon"
start() {
echo -n $"Starting $desc (zookeeper): "
daemon --user $ZOOUSER $ZOOKEEPER/bin/zkServer.sh start
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/zookeeper
return $RETVAL
}
stop() {
echo -n $"Stopping $desc (zookeeper): "
daemon --user $ZOOUSER $ZOOKEEPER/bin/zkServer.sh stop
RETVAL=$?
sleep 5
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/zookeeper $PIDFILE
}
restart() {
stop
start
}
get_pid() {
cat "$PIDFILE"
}
checkstatus(){
status -p $PIDFILE ${JAVA_HOME}/bin/java
RETVAL=$?
}
condrestart(){
[ -e /var/lock/subsys/zookeeper ] && restart || :
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
checkstatus
;;
restart)
restart
;;
condrestart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart}"
exit 1
esac
exit $RETVAL
答案2
您可能需要安装 lsb-core(apt-get install lsb-core)才能使用“source /etc/rc.d/init.d/functions”中包含的功能。路径会有所不同。对于我自己(Ubuntu Server 16.04.5 LTS),路径是“/lib/lsb/init-functions”,而不是“/etc/rc.d/init.d/functions”