| #!/bin/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() { |
| echo -e "Usage: ${0} {classpath} {mainclass} [dir]\n\n\ |
| Runs a Java application while saving its stdout to dir/mainclass.out, its stderr to dir/mainclass.err, and its process id to dir/mainclass.pid.\n\ |
| \n\ |
| This script starts a Java application only if it cannot find its pid. If the process id specified by dir/mainclass.pid exists, then the script will not start the application.\n\ |
| \n\ |
| classpath The application's class path.\n\ |
| classname The name of the class to be launched.\n\ |
| dir The directory where the process stdout, stderr and pid files are\n\ |
| written. If dir is not specified, then the files are saved into\n\ |
| the current directory.\n\ |
| " |
| } |
| |
| # _get_pid program [pidfile] |
| # Set $pid to pids from /tmp* for {program}. |
| # $pid should be declared local in the caller. |
| _get_pid() { |
| local base=${1##*/} |
| local pid_file=${2:-/tmp/$base.pid} |
| |
| pid= |
| if [ -f "$pid_file" ] ; then |
| local p |
| |
| [ ! -r "$pid_file" ] && return 1 # "Cannot access pid file" |
| |
| p=$(cat "$pid_file") |
| [ -z "${p//[0-9]/}" ] && [ -d "/proc/$p" ] && pid="$p" |
| if [ -n "$pid" ]; then |
| return 0 |
| fi |
| return 2 # "Program is not running but pid file exists" |
| fi |
| return 3 # "Program pid file does not exist" |
| } |
| |
| # _readlink path |
| # Output the full path, replacement for readlink -f |
| _readlink() { |
| ( |
| pushd ${1%/*} > /dev/null 2>&1 |
| echo $PWD/${1##*/} |
| popd > /dev/null 2>&1 |
| ) |
| } |
| |
| # _dirname path |
| # Get the directory name, replacement for dirname. |
| _dirname() { |
| echo ${1%/*} |
| } |
| |
| _error() { |
| echo $1; exit 1 |
| } |
| |
| |
| ## Main script |
| #[ ! -n "${EDGENT:-}" ] && EDGENT=../.. |
| [ ! -n "${JAVA_HOME:-}" ] && _error "JAVA_HOME must be set" |
| |
| if [ $# -lt 2 ]; then |
| _usage |
| exit 1 |
| fi |
| |
| classpath=${1} |
| main_class=${2} |
| out_dir=${3:-.} |
| |
| # Command to start the application. |
| command="${JAVA_HOME}/bin/java -cp ${classpath} ${main_class}" |
| |
| if [[ ! -d ${out_dir} || ${out_dir:0:1} != '/' ]]; then |
| ## out_dir as absolute path |
| out_dir=$(_readlink ${out_dir}) |
| out_dir=$(_dirname ${out_dir}) |
| fi |
| |
| pid_file=${out_dir}/${main_class}.pid |
| out_file=${out_dir}/${main_class}.out |
| err_file=${out_dir}/${main_class}.err |
| pid= |
| |
| _get_pid $main_class $pid_file |
| RC="$?" |
| [ $RC == "1" ] && _error "Cannot access pid file $pid_file" |
| |
| if [ -z "$pid" ]; then |
| $command >> $out_file 2>> $err_file & |
| pid="$!" |
| echo $pid >| $pid_file |
| echo -e "The program was restarted with command:\n\ |
| ${command}\n\ |
| Process id: $pid" |
| else |
| echo "The program's process id is $pid" |
| fi |