|  | #!/usr/bin/env bash | 
|  | # | 
|  | # Licensed to the Apache Software Foundation (ASF) under one | 
|  | # or more contributor license agreements.  See the NOTICE file | 
|  | # distributed with this work for additional information | 
|  | # regarding copyright ownership.  The ASF licenses this file | 
|  | # to you under the Apache License, Version 2.0 (the | 
|  | # "License"); you may not use this file except in compliance | 
|  | # with the License.  You may obtain a copy of the License at | 
|  | # | 
|  | #   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, | 
|  | # software distributed under the License is distributed on an | 
|  | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | # KIND, either express or implied.  See the License for the | 
|  | # specific language governing permissions and limitations | 
|  | # under the License. | 
|  | # | 
|  |  | 
|  | usage() { | 
|  | cat <<EOF | 
|  | Usage: pulsar-daemon (start|stop|restart) <command> <args...> | 
|  | where command is one of: | 
|  | broker              Run a broker server | 
|  | bookie              Run a bookie server | 
|  | zookeeper           Run a zookeeper server | 
|  | configuration-store Run a configuration-store server | 
|  | websocket           Run a websocket proxy server | 
|  | functions-worker    Run a functions worker server | 
|  | standalone          Run a standalone Pulsar service | 
|  | proxy               Run a Proxy Pulsar service | 
|  | autorecovery        Run an autorecovery service | 
|  |  | 
|  | where argument is one of: | 
|  | -force (accepted only with stop command): Decides whether to stop the server forcefully if not stopped by normal shutdown | 
|  | EOF | 
|  | } | 
|  |  | 
|  | BINDIR=$(dirname "$0") | 
|  | PULSAR_HOME=$(cd -P $BINDIR/..;pwd) | 
|  | # log directory | 
|  | export PULSAR_LOG_DIR=${PULSAR_LOG_DIR:-"$PULSAR_HOME/logs"} | 
|  |  | 
|  | if [ $# = 0 ]; then | 
|  | usage | 
|  | exit 1 | 
|  | elif [ $# = 1 ]; then | 
|  | if [ $1 == "--help" -o $1 == "-h" ]; then | 
|  | usage | 
|  | exit 1 | 
|  | else | 
|  | echo "Error: no enough arguments provided." | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | startStop=$1 | 
|  | shift | 
|  | command=$1 | 
|  | shift | 
|  |  | 
|  | # Check bookkeeper env and load bkenv.sh | 
|  | if [ -f "$PULSAR_HOME/conf/bkenv.sh" ] | 
|  | then | 
|  | . "$PULSAR_HOME/conf/bkenv.sh" | 
|  | fi | 
|  |  | 
|  | if [[ -f "$PULSAR_HOME/conf/pulsar_env.sh" && $COMMAND != "bookie" ]] | 
|  | then | 
|  | . "$PULSAR_HOME/conf/pulsar_env.sh" | 
|  | fi | 
|  |  | 
|  | if [[ "$command" = "bookie" ]] | 
|  | then | 
|  | PULSAR_PID_DIR=${BOOKIE_PID_DIR:-"$PULSAR_HOME/bin"} | 
|  | else | 
|  | PULSAR_PID_DIR=${PULSAR_PID_DIR:-"$PULSAR_HOME/bin"} | 
|  | fi | 
|  | export PULSAR_LOG_APPENDER=${PULSAR_LOG_APPENDER:-"RollingFile"} | 
|  | PULSAR_STOP_TIMEOUT=${PULSAR_STOP_TIMEOUT:-30} | 
|  | mkdir -p "$PULSAR_LOG_DIR" | 
|  | mkdir -p "$PULSAR_PID_DIR" | 
|  |  | 
|  | case $command in | 
|  | (broker) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (bookie) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (zookeeper) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (global-zookeeper) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (configuration-store) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (websocket) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (functions-worker) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (standalone) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (proxy) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (autorecovery) | 
|  | echo "doing $startStop $command ..." | 
|  | ;; | 
|  | (*) | 
|  | echo "Error: unknown service name $command" | 
|  | usage | 
|  | exit 1 | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | export PULSAR_LOG_FILE=pulsar-$command-$HOSTNAME.log | 
|  |  | 
|  | pid=$PULSAR_PID_DIR/pulsar-$command.pid | 
|  | out=$PULSAR_LOG_DIR/pulsar-$command-$HOSTNAME.out | 
|  | logfile=$PULSAR_LOG_DIR/$PULSAR_LOG_FILE | 
|  |  | 
|  | rotate_out_log () | 
|  | { | 
|  | log=$1; | 
|  | num=5; | 
|  | if [ -n "$2" ]; then | 
|  | num=$2 | 
|  | fi | 
|  | if [ -f "$log" ]; then # rotate logs | 
|  | while [ $num -gt 1 ]; do | 
|  | prev=`expr $num - 1` | 
|  | [ -f "$log.$prev" ] && mv "$log.$prev" "$log.$num" | 
|  | num=$prev | 
|  | done | 
|  | mv "$log" "$log.$num"; | 
|  | fi | 
|  | } | 
|  |  | 
|  | start () | 
|  | { | 
|  | if [ -f $pid ]; then | 
|  | if ps -p `cat $pid` > /dev/null 2>&1; then | 
|  | echo $command running as process `cat $pid`.  Stop it first. | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | rotate_out_log $out | 
|  | echo starting $command, logging to $logfile | 
|  | echo Note: Set immediateFlush to true in conf/log4j2.yaml will guarantee the logging event is flushing to disk immediately. The default behavior is switched off due to performance considerations. | 
|  | pulsar=$PULSAR_HOME/bin/pulsar | 
|  | nohup $pulsar $command "$@" > "$out" 2>&1 < /dev/null & | 
|  | echo $! > $pid | 
|  | sleep 1; head $out | 
|  | sleep 2; | 
|  | if ! ps -p $! > /dev/null ; then | 
|  | exit 1 | 
|  | fi | 
|  | } | 
|  |  | 
|  | stop () | 
|  | { | 
|  | if [ -f $pid ]; then | 
|  | TARGET_PID=$(cat $pid) | 
|  | if ps -p $TARGET_PID > /dev/null 2>&1; then | 
|  | echo "stopping $command" | 
|  | kill $TARGET_PID | 
|  |  | 
|  | count=0 | 
|  | location=$PULSAR_LOG_DIR | 
|  | while ps -p $TARGET_PID > /dev/null; | 
|  | do | 
|  | echo "Shutdown is in progress... Please wait..." | 
|  | sleep 1 | 
|  | count=`expr $count + 1` | 
|  |  | 
|  | if [ "$count" = "$PULSAR_STOP_TIMEOUT" ]; then | 
|  | break | 
|  | fi | 
|  | done | 
|  |  | 
|  | if [ "$count" != "$PULSAR_STOP_TIMEOUT" ]; then | 
|  | echo "Shutdown completed." | 
|  | fi | 
|  |  | 
|  | if ps -p $TARGET_PID > /dev/null 2>&1; then | 
|  | fileName=$location/$command.out | 
|  | $JAVA_HOME/bin/jstack $TARGET_PID > $fileName | 
|  | echo "Thread dumps are taken for analysis at $fileName" | 
|  | if [ "$1" == "-force" ] | 
|  | then | 
|  | echo "forcefully stopping $command" | 
|  | kill -9 $TARGET_PID >/dev/null 2>&1 | 
|  | echo Successfully stopped the process | 
|  | else | 
|  | echo "WARNNING :  $command is not stopped completely." | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  | else | 
|  | echo "no $command to stop" | 
|  | fi | 
|  | rm $pid | 
|  | else | 
|  | echo no "$command to stop" | 
|  | fi | 
|  | } | 
|  |  | 
|  | case $startStop in | 
|  | (start) | 
|  | start "$@" | 
|  | ;; | 
|  |  | 
|  | (stop) | 
|  | stop $1 | 
|  | ;; | 
|  |  | 
|  | (restart) | 
|  | if [[ "$1" == "-force" ]] | 
|  | then | 
|  | stop -force | 
|  | # remove "-force" from the arguments | 
|  | shift | 
|  | else | 
|  | stop | 
|  | fi | 
|  | if [ "$?" == 0 ] | 
|  | then | 
|  | sleep 3 | 
|  | start "$@" | 
|  | else | 
|  | echo "WARNNING :  $command failed restart, for $command is not stopped completely." | 
|  | fi | 
|  | ;; | 
|  |  | 
|  | (*) | 
|  | usage | 
|  | exit 1 | 
|  | ;; | 
|  | esac |