diff --git a/rc.d/rc.template b/rc.d/rc.template index 1454934..23f6de3 100755 --- a/rc.d/rc.template +++ b/rc.d/rc.template @@ -14,10 +14,10 @@ PIDFILE="" # EXTRA_ARGS=() # Extra arguments passed to $EXEC. Must be an array. # SLAY_DELAY="" # Delay between the SIGTERM and SIGKILL on a 'stop'. Default: 2s. # RESTART_DELAY="" # Delay between stopping and starting on a 'restart'. Default: 2s. -[[ -e "/etc/default/${0##*rc.}" ]] && source "/etc/default/${0##*rc.}" +[[ -e "/etc/default/${0##*rc.}" ]] && { source "/etc/default/${0##*rc.}" || return 1 2>/dev/null || exit 1; } error() { - printf "%s: %s: %s\\n" "${BASH_SOURCE##*/}" "${EXEC##*/}" "$*" >&2 + printf "%s: %s: %s\\n" "${BASH_SOURCE[0]##*/}" "${EXEC##*/}" "$*" >&2 } checkconfigured() { @@ -31,17 +31,17 @@ checkconfigured() { checkstatus() { local RUNPIDS="$({ pgrep -f "$EXEC"; pgrep -F "$PIDFILE" 2>/dev/null; } | sort -u )" if [[ ! -z "$RUNPIDS" ]]; then - printf "%s: %s: %s" "${BASH_SOURCE##*/}" "${EXEC##*/}" "running" + printf "%s: %s: %s" "${BASH_SOURCE[0]##*/}" "${EXEC##*/}" "running" if [[ ! -z "$PIDFILE" ]]; then if [[ ! -e "$PIDFILE" ]]; then printf "%s" ", but .pid file does not exist" - elif ! grep "\<$(< "$PIDFILE")\>" <<<"$RUNPIDS" >/dev/null 2>&1; then + elif ! grep "\<$(<"$PIDFILE")\>" <<<"$RUNPIDS" >/dev/null 2>&1; then printf "%s" ", but .pid file is stale" fi fi printf "\\n" else - printf "%s: %s: %s\\n" "${BASH_SOURCE##*/}" "${EXEC##*/}" "stopped" + printf "%s: %s: %s\\n" "${BASH_SOURCE[0]##*/}" "${EXEC##*/}" "stopped" return 1 fi return 0 @@ -50,30 +50,34 @@ checkstatus() { startdaemon() { if [[ ! -e "$EXEC" ]]; then error "not found" - return 1 + return 2 elif [[ ! -x "$EXEC" ]]; then error "not executable" - return 1 + return 2 elif ! checkconfigured; then error "not started - pre-start checks failed" - return 1 + return 2 fi ${ENVIRONMENT:+declare ${ENVIRONMENT[*]};} "$EXEC" ${ARGS[*]} ${EXTRA_ARGS[*]} if (( $? != 0 )); then error "error starting daemon" - return 1 + return 2 else return 0 fi } stopdaemon() { - [[ -e "$PIDFILE" ]] && kill -TERM "$(< "$PIDFILE")" >/dev/null 2>&1 || kill -TERM "$(pgrep -f "$EXEC" | tr $'\n' " ")" >/dev/null 2>&1 + kill -TERM "$(pgrep -f "$EXEC" | tr $'\n' " ")" >/dev/null 2>&1 + [[ -e "$PIDFILE" ]] && { + sleep 0.5 + kill -TERM "$(<"$PIDFILE")" >/dev/null 2>&1 + } sleep "${SLAY_DELAY:-2}" - if checkstatus >/dev/null; then + checkstatus >/dev/null && { error "failed to stop gracefully - slaying" kill -KILL "$({ cat "$PIDFILE"; pgrep -f "$EXEC"; } 2>/dev/null | sort -u | tr $'\n' " ")" >/dev/null 2>&1 - fi + } return 0 } @@ -81,7 +85,7 @@ case "$1" in 'start') if checkstatus >/dev/null; then error "already running" - printf " %s\\n" "Try: $BASH_SOURCE status" >&2 + printf " %s\\n" "Try: ${BASH_SOURCE[0]} status" >&2 RET=1 else startdaemon @@ -91,7 +95,7 @@ case "$1" in 'stop') if ! checkstatus >/dev/null; then error "not running" - printf " %s\\n" "Try: $BASH_SOURCE status" >&2 + printf " %s\\n" "Try: ${BASH_SOURCE[0]} status" >&2 RET=1 else stopdaemon @@ -99,20 +103,20 @@ case "$1" in fi ;; 'restart') - if checkstatus >/dev/null; then - stopdaemon && sleep "${RESTART_DELAY:-2}" && startdaemon - RET=$? - else - startdaemon - RET=$? - fi + checkstatus >/dev/null + (( $? != 3 )) && { + stopdaemon >/dev/null 2>&1 + sleep "${RESTART_DELAY:-2}" + } + startdaemon + RET=$? ;; 'status') checkstatus RET=$? ;; *) - printf "%s\\n" "Usage: $BASH_SOURCE " >&2 + printf "%s\\n" "Usage: ${BASH_SOURCE[0]} " >&2 RET=1 ;; esac