#!/bin/sh # # Copyright © 2014 Cask Data, Inc. # # Licensed 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. # # Source function library. used for "status" use case if [ -f "/etc/rc.d/init.d/functions" ]; then PLATFORM="RHEL" . /etc/rc.d/init.d/functions elif [ -f /lib/lsb/init-functions ] ; then PLATFORM="UBUNTU" . /lib/lsb/init-functions else PLATFORM="UNSUPPORTED" fi # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" bin=`dirname "${BASH_SOURCE-$0}"` bin=`cd "$bin"; pwd` lib="$bin"/../lib conf="$bin"/../conf script=`basename $0` # Resolve relative symlinks while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/.." APP_HOME="`pwd -P`" APP=`basename $0` # Load component common environment file too . $bin/tephra-env.sh pid=$PID_DIR/tephra-service-${IDENT_STRING}.pid # In other environment, the jars are expected to be in /lib directory. # Load all the jar files. Not ideal, but we need to load only the things that # is needed by this script. if [ "$CLASSPATH" = "" ]; then CLASSPATH=${lib}/* else CLASSPATH=$CLASSPATH:${lib}/* fi # Load the configuration too. if [ -d "$conf" ]; then CLASSPATH=$CLASSPATH:"$conf"/ fi # Set Log location if [ ! -e $LOG_DIR ]; then mkdir -p $LOG_DIR; fi export LOG_PREFIX="tephra-service-$IDENT_STRING-$HOSTNAME" export LOGFILE=$LOG_PREFIX.log loglog="${LOG_DIR}/${LOGFILE}" # set the classpath to include hadoop and hbase dependencies set_classpath() { COMP_HOME=$1 if [ -n "$HBASE_HOME" ]; then HBASE_CP=`$HBASE_HOME/bin/hbase classpath` elif [ `which hbase` ]; then HBASE_CP=`hbase classpath` fi export HBASE_CP if [ -n "$HBASE_CP" ]; then CP=$COMP_HOME/phoenix-client/target/*:$HBASE_CP:$EXTRA_CLASSPATH else # assume Hadoop/HBase libs are included via EXTRA_CLASSPATH echo "WARN: could not find Hadoop and HBase libraries" CP=$COMP_HOME/phoenix-client/target/*:$EXTRA_CLASSPATH fi # Setup classpaths. if [ -n "$CLASSPATH" ]; then CLASSPATH=$CLASSPATH:$CP else CLASSPATH=$CP fi export CLASSPATH } # Attempts to find JAVA in few ways. set_java () { # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables export JAVA="$JAVA_HOME/jre/sh/java" else export JAVA="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVA" ] ; then echo "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." >&2 exit 1 fi else export JAVA="java" which java >/dev/null 2>&1 || { echo "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." >&2 ; exit 1; } fi } # checks if there exists a PID that is already running. return 0 idempotently check_before_start() { if [ ! -d "$PID_DIR" ]; then mkdir -p "$PID_DIR" fi if [ -f $pid ]; then if kill -0 `cat $pid` > /dev/null 2>&1; then #echo "$APP $SERVICE running as process `cat $pid`. Stop it first." echo "$APP running as process `cat $pid`. Stop it first." exit 0 fi fi } # Set Niceness if [ "$NICENESS" = "" ]; then export NICENESS=0 fi start() { # Setup classpaths. set_classpath $APP_HOME # sets the JAVA variable. set_java check_before_start echo "`date` Starting $APP service on `hostname`" echo "`date` Starting $APP service on `hostname`" >> $loglog echo "`ulimit -a`" >> $loglog 2>&1 export MAIN_CLASS="org.apache.tephra.TransactionServiceMain" echo "Running class $MAIN_CLASS" echo "Command: " "$JAVA" $OPTS -cp $CLASSPATH $JAVA_HEAPMAX $MAIN_CLASS >>$loglog nohup nice -n $NICENESS "$JAVA" $OPTS -cp $CLASSPATH $JAVA_HEAPMAX ${MAIN_CLASS} >$loglog 2>&1 & echo $! >$pid } stop() { if [ -f $pid ]; then pidToKill=`cat $pid` # kill -0 == see if the PID exists if kill -0 $pidToKill > /dev/null 2>&1; then echo -n stopping $command echo "`date` Terminating $command" >> $loglog kill $pidToKill > /dev/null 2>&1 while kill -0 $pidToKill > /dev/null 2>&1; do echo -n "." sleep 1; done rm $pid echo else retval=$? echo nothing to stop because kill -0 of pid $pidToKill failed with status $retval fi rm -f $pid else echo nothing to stop because no pid file $pid fi } restart() { stop start } condrestart(){ case "$PLATFORM" in "RHEL") rh_status > /dev/null 2>&1 retval=$? ;; "UBUNTU") ub_status > /dev/null 2>&1 retval=$? ;; "UNSUPPORTED") echo "condrestart is not supported on platform" exit 1 ;; esac if [[ $retval -eq 0 ]]; then restart fi } rh_status() { echo "checking status" # call sourced status function status -p $pid } ub_status() { echo "checking status" # call sourced status function status_of_proc -p $pid "$0" "$APP" } # Executes a specific class' main method with the classpath and environment setup run() { classname=$1 shift if [ -z "$classname" ]; then echo "ERROR: No classname was given!" echo "Usage: $0 run [arguments]" exit 1 fi # Setup classpaths. set_classpath $APP_HOME # sets the JAVA variable. set_java echo "Running class $classname" "$JAVA" $OPTS -cp $CLASSPATH $JAVA_HEAPMAX $classname $@ } case "$1" in start) $1 ;; stop) $1 ;; restart) $1 ;; condrestart) $1 ;; status) case "$PLATFORM" in "RHEL") rh_status ;; "UBUNTU") ub_status ;; "UNSUPPORTED") echo "status is not supported on platform" exit 1 ;; esac ;; classpath) set_classpath $APP_HOME set_java echo $CLASSPATH ;; run) shift run $@ ;; *) echo "Usage: $0 {start|stop|restart|status|run}" exit 1 ;; esac exit $?