blob: 24611c4bf4e73166993475df03699c20188f14df [file] [log] [blame]
#!/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.
#
# Support functions
#
# Follow symlinks on Linux and Darwin
function real_script_name() {
local base=$1
local real
if readlink -f $base >/dev/null 2>&1; then
# Darwin/Mac OS X
real=`readlink -f $base`
fi
if [[ "$?" != "0" || -z "$real" ]]; then
# Linux
local bin=$(cd -P -- "$(dirname -- "$base")">/dev/null && pwd -P)
local script="$(basename -- "$base")"
real="$bin/$script"
fi
echo "$real"
}
function usage() {
echo "usage: $0 [start|stop|foreground]"
echo " start Start the Webhcat Server"
echo " stop Stop the Webhcat Server"
echo " foreground Run the Webhcat Server in the foreground"
exit 1
}
# Print an error message and exit
function die() {
echo "webhcat: $@" 1>&2
exit 1
}
# Print an message
function log() {
echo "webhcat: $@"
}
# return(print) the webhcat jar
function find_jar_path() {
for dir in "." "build" "share/webhcat/svr/"; do
if (( `ls -1 $base_dir/$dir/$WEBHCAT_JAR 2>/dev/null| wc -l ` > 1 )) ; then
echo "Error: found more than one hcatalog jar in $base_dir/$dir/$WEBHCAT_JAR"
exit 1
fi
if (( `ls -1 $base_dir/$dir/$WEBHCAT_JAR 2>/dev/null | wc -l` == 0 )) ; then
continue
fi
local jar=`ls $base_dir/$dir/$WEBHCAT_JAR`
if [[ -f $jar ]]; then
echo $jar
break
fi
done
}
# Find the webhcat classpath
function find_classpath() {
local classpath=""
for dir in "share/webhcat/svr/" "share/webhcat/svr/lib/" "conf" ; do
local path="$base_dir/$dir"
if [[ -d $path ]]; then
for jar_or_conf in $path/*; do
if [[ -z "$classpath" ]]; then
classpath="$jar_or_conf"
else
classpath="$classpath:$jar_or_conf"
fi
done
fi
done
if [[ -n "$WEBHCAT_CONF_DIR" ]]; then
if [[ -z "$classpath" ]]; then
classpath="$WEBHCAT_CONF_DIR"
else
classpath="$classpath:$WEBHCAT_CONF_DIR"
fi
fi
# Append hcat classpath
local hcat_classpath
hcat_classpath=`$base_dir/bin/hcat -classpath`
if [[ "$?" != "0" ]]; then
die "Unable to get the hcatalog classpath"
fi
echo "$classpath:$hcat_classpath"
}
# Check if the pid is running
function check_pid() {
local pid=$1
if ps -p $pid > /dev/null; then
return 0
else
return 1
fi
}
# Start the webhcat server in the foreground
function foreground_webhcat() {
$start_cmd
}
# Start the webhcat server in the background. Record the PID for
# later use.
function start_webhcat() {
if [[ -f $PID_FILE ]]; then
# Check if there is a server running
local pid=`cat $PID_FILE`
if check_pid $pid; then
die "already running on process $pid"
fi
fi
log "starting ..."
log "$start_cmd"
nohup $start_cmd >>$CONSOLE_LOG 2>>$ERROR_LOG &
local pid=$!
if [[ -z "${pid}" ]] ; then # we failed right off
die "failed to start. Check logs in " `dirname $ERROR_LOG`
fi
sleep $SLEEP_TIME_AFTER_START
if check_pid $pid; then
echo $pid > $PID_FILE
log "starting ... started."
else
die "failed to start. Check logs in " `dirname $ERROR_LOG`
fi
}
# Stop a running server
function stop_webhcat() {
local pid
if [[ -f $PID_FILE ]]; then
# Check if there is a server running
local check=`cat $PID_FILE`
if check_pid $check; then
pid=$check
fi
fi
if [[ -z "$pid" ]]; then
log "no running server found"
else
log "stopping ..."
kill $pid
sleep $SLEEP_TIME_AFTER_START
if check_pid $pid; then
die "failed to stop"
else
log "stopping ... stopped"
fi
fi
}
#
# Build command line and run
#
this=`real_script_name "${BASH_SOURCE-$0}"`
this_bin=`dirname $this`
base_dir="$this_bin/.."
if [[ -f "$base_dir/libexec/webhcat_config.sh" ]]; then
. "$base_dir/libexec/webhcat_config.sh"
else
. "$this_bin/webhcat_config.sh"
fi
JAR=`find_jar_path`
if [[ -z "$JAR" ]]; then
die "No webhcat jar found"
fi
CLASSPATH=`find_classpath`
if [[ -z "$CLASSPATH" ]]; then
die "No classpath or jars found"
fi
CLASSPATH="$JAR:$CLASSPATH"
if [[ -z "$HADOOP_CLASSPATH" ]]; then
export HADOOP_CLASSPATH="$CLASSPATH"
else
export HADOOP_CLASSPATH="$CLASSPATH:$HADOOP_CLASSPATH"
fi
if [[ -z "$WEBHCAT_LOG4J" ]]; then
if [[ -f "$base_dir/conf/webhcat-log4j.properties" ]]; then
WEBHCAT_LOG4J="$base_dir/conf/webhcat-log4j.properties";
elif [[ -f "$base_dir/conf/webhcat-log4j.properties" ]]; then
WEBHCAT_LOG4J="$base_dir/conf/webhcat-log4j.properties";
else
WEBHCAT_LOG4J="webhcat-log4j.properties";
fi
fi
export HADOOP_USER_CLASSPATH_FIRST=true
export HADOOP_OPTS="${HADOOP_OPTS} -Dwebhcat.log.dir=$WEBHCAT_LOG_DIR -Dlog4j.configuration=$WEBHCAT_LOG4J"
start_cmd="$HADOOP_PREFIX/bin/hadoop jar $JAR org.apache.hcatalog.templeton.Main "
cmd=$1
case $cmd in
start)
start_webhcat
;;
stop)
stop_webhcat
;;
foreground)
foreground_webhcat
;;
*)
usage
;;
esac
log "done"