Systemd

動物園管理員的初始化腳本

  • September 24, 2018

我已經看到 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.

這什麼有效

# 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

引用自:https://serverfault.com/questions/870312