diff --git a/ssm b/ssm index b6c308e..75b891e 100755 --- a/ssm +++ b/ssm @@ -188,6 +188,8 @@ depend_ready() { super_start() { (( service_running )) && return 3 + rm -f "$service_stopped_flag" + [[ -f "${service_command[0]}" ]] || return 9 depend "${service_depends[@]}" || return 7 @@ -250,6 +252,7 @@ super_stop() { nullexec kill -n "$service_stop_signal" "$service_pid" || return 1 pid_wait "$service_pid" || return 5 + > "$service_stopped_flag" return 0 fi @@ -318,6 +321,8 @@ logs() { "${PAGER:-less}" "$service_logfile"; } status() { (( service_running )) && return 0 (( service_enabled )) && return 0 + (( service_stopped )) && return 7 + return 1 } @@ -410,6 +415,7 @@ main() { default service_reload_signal 1 default service_ready_flag "$rundir/$service_name.ready" default service_enabled_flag "$rundir/$service_name.enabled" + default service_stopped_flag "$rundir/$service_name.stopped" # default does not support arrays [[ "$service_signals" ]] || service_signals=( 1 10 12 ) @@ -430,9 +436,20 @@ main() { service_enabled=1 fi + # Let's see if the service was deliberately stopped + if [[ -f "$service_stopped_flag" ]]; then + # Ooh, it was. + service_stopped=1 + fi + # Check if action is even defined is_function "$2" || die 17 "Function $2 is not defined for $service_name." + # cd into the workdir, if defined. + [[ "$service_workdir" ]] && { + cd "$service_workdir" || die $? + } + # Run pre_$action function if is_function "pre_$2"; then "pre_$2" || { @@ -475,7 +492,8 @@ main() { else result "$res" \ 0 "$service_name is running" \ - 1 "$service_name is not running" + 1 "$service_name is not running" \ + 7 "$service_name was stopped" fi ;; esac