blob: d44ab37dc0bc080ba8e1ed428ecab2368ecca4d2 [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.
function print_usage {
cat <<EOF
Usage: accumulo-service <service> <command>
Services:
gc Accumulo garbage collector
monitor Accumulo monitor
master Accumulo master
tserver Accumulo tserver
tracer Accumulo tracter
Commands:
start Starts service
stop Stops service
kill Kills service
EOF
exit 1
}
function invalid_args {
echo -e "Invalid arguments: $1\n"
print_usage 1>&2
exit 1
}
function rotate_log () {
logfile="$1"
max_retained="5"
if [ -f "$logfile" ]; then
while [[ "$max_retained" -gt 1 ]]; do
prev=$(( max_retained - 1))
[ -f "$logfile.$prev" ] && mv -f "$logfile.$prev" "$logfile.$max_retained"
max_retained=$prev
done
mv -f "$logfile" "$logfile.$max_retained";
fi
}
function start_service() {
if [ -f "$pid_file" ]; then
pid=$(cat "$pid_file")
if kill -0 "$pid" 2>/dev/null; then
echo "$host : $service already running (${pid})"
exit 0
fi
fi
echo "Starting $service on $host"
if [[ $service == "master" ]]; then
"${bin}/accumulo" org.apache.accumulo.master.state.SetGoalState NORMAL
fi
outfile="${ACCUMULO_LOG_DIR}/${service}_${host}.out"
errfile="${ACCUMULO_LOG_DIR}/${service}_${host}.err"
rotate_log "$outfile"
rotate_log "$errfile"
nohup "${bin}/accumulo" "$service" >"$outfile" 2>"$errfile" < /dev/null &
echo "$!" > "${pid_file}"
# Check the max open files limit and selectively warn
max_files_open=$(ulimit -n)
if [[ -n $max_files_open ]] ; then
max_files_recommended=32768
if (( max_files_open < max_files_recommended )); then
echo "WARN : Max open files on $host is $max_files_open, recommend $max_files_recommended" >&2
fi
fi
}
function stop_service() {
if [ -f "$pid_file" ]; then
echo "Stopping $service on $host";
kill -s TERM "$(cat "$pid_file")" 2>/dev/null
rm -f "${pid_file}" 2>/dev/null
fi
}
function kill_service() {
if [ -f "$pid_file" ]; then
echo "Killing $service on $host";
kill -s KILL "$(cat "$pid_file")" 2>/dev/null
rm -f "${pid_file}" 2>/dev/null
fi
}
function main() {
if [[ -z $1 ]]; then
invalid_args "<service> cannot be empty"
fi
# Resolve base directory
SOURCE="${BASH_SOURCE[0]}"
while [ -h "${SOURCE}" ]; do
bin="$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
SOURCE="$(readlink "${SOURCE}")"
[[ "${SOURCE}" != /* ]] && SOURCE="${bin}/${SOURCE}"
done
# Set up variables needed by accumulo-env.sh
export bin="$( cd -P "$( dirname "${SOURCE}" )" && pwd )"
export basedir=$( cd -P "${bin}"/.. && pwd )
export conf="${ACCUMULO_CONF_DIR:-${basedir}/conf}"
export lib="${basedir}/lib"
if [ -f "${conf}/accumulo-env.sh" ]; then
source "${conf}/accumulo-env.sh"
fi
ACCUMULO_LOG_DIR="${ACCUMULO_LOG_DIR:-${basedir}/logs}"
mkdir -p "$ACCUMULO_LOG_DIR" 2>/dev/null
mkdir -p "${basedir}/run" 2>/dev/null
host="$(hostname)"
if [[ -z "$host" ]]; then
host=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')
fi
service="$1"
pid_file="${basedir}/run/accumulo-${service}.pid"
case "$service" in
gc|master|monitor|tserver|tracer)
if [[ -z $2 ]]; then
invalid_args "<command> cannot be empty"
fi
case "$2" in
start)
start_service
;;
stop)
stop_service
;;
kill)
kill_service
;;
*)
invalid_args "'$2' is an invalid <command>"
;;
esac
;;
*)
invalid_args "'$service' is an invalid <service>"
;;
esac
}
main "$@"