#!/bin/bash set -euo pipefail STANDARD_HOME_DIR="${STANDARD_HOME_DIR:?STANDARD_HOME_DIR is required}" STANDARD_RUN_USER="${STANDARD_RUN_USER:?STANDARD_RUN_USER is required}" STANDARD_JAVA_HOME="${STANDARD_JAVA_HOME:-${STANDARD_HOME_DIR}/jdk}" STOP_TIMEOUT_SECONDS="${STOP_TIMEOUT_SECONDS:-30}" run_as_standard_user() { local app_dir="$1" local script_name="$2" sudo -n -u "${STANDARD_RUN_USER}" /bin/bash -lc ' set -euo pipefail app_dir="$1" script_name="$2" java_home="$3" cd "${app_dir}" export JAVA_HOME="${java_home}" export PATH="${JAVA_HOME}/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}" exec /bin/bash "./${script_name}" ' -- "${app_dir}" "${script_name}" "${STANDARD_JAVA_HOME}" } wait_until_stopped() { local pattern="$1" local label="$2" local deadline=$((SECONDS + STOP_TIMEOUT_SECONDS)) while pgrep -f "${pattern}" >/dev/null 2>&1; do if (( SECONDS >= deadline )); then echo "[WARN] ${label} still running after ${STOP_TIMEOUT_SECONDS}s, force killing" pkill -9 -f "${pattern}" >/dev/null 2>&1 || true break fi sleep 1 done } stop_by_pattern() { local pattern="$1" local label="$2" if pgrep -f "${pattern}" >/dev/null 2>&1; then echo "[INFO] stopping ${label}: ${pattern}" pkill -f "${pattern}" >/dev/null 2>&1 || true wait_until_stopped "${pattern}" "${label}" fi } if [ -x "${STANDARD_HOME_DIR}/cmsp/stop_cmsp.sh" ]; then run_as_standard_user "${STANDARD_HOME_DIR}/cmsp" "stop_cmsp.sh" || true fi stop_by_pattern "${STANDARD_HOME_DIR}/cmsp" "CMEP-CMSP path" stop_by_pattern "CMEP-CMSP" "CMEP-CMSP jar" if [ -x "${STANDARD_HOME_DIR}/cmtp/stop_cmtp.sh" ]; then run_as_standard_user "${STANDARD_HOME_DIR}/cmtp" "stop_cmtp.sh" || true fi stop_by_pattern "${STANDARD_HOME_DIR}/cmtp" "CMEP-CMTP path" stop_by_pattern "CMEP-CMTP" "CMEP-CMTP jar"