From 5bfba451f9ea6321de03839b933b4a270cfdaaa3 Mon Sep 17 00:00:00 2001 From: Leonard Kugis Date: Tue, 14 Oct 2025 21:19:13 +0200 Subject: service: Added lock to prevent multiple starts of the script on startup --- service.sh | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'service.sh') diff --git a/service.sh b/service.sh index 43f8c75..8cb77c1 100644 --- a/service.sh +++ b/service.sh @@ -30,8 +30,50 @@ BOOTWAIT_COUNT_INTERVAL=15 CONF_MAIN="${MODDIR}/config/main.conf" CONF_FSTAB="${MODDIR}/config/fstab.conf" -# Check if configs are readable +# --- single-run lock (prevents concurrent starts) --------------------------- +LOCKDIR="${MODDIR}/.runlock" +PIDFILE="${LOCKDIR}/pid" + +acquire_lock() { + # Versuche Lock-Verzeichnis atomar anzulegen + if mkdir "${LOCKDIR}" 2>/dev/null; then + # Lock bekommen + echo "$$" > "${PIDFILE}" + # Bei Exit Lock säubern + trap 'rc=$?; rm -f "${PIDFILE}"; rmdir "${LOCKDIR}" 2>/dev/null; exit $rc' INT TERM EXIT + return 0 + fi + + # Lock existiert -> prüfen, ob stale + if [ -f "${PIDFILE}" ]; then + oldpid="$(cat "${PIDFILE}" 2>/dev/null)" + if [ -n "${oldpid}" ] && [ -d "/proc/${oldpid}" ]; then + # Anderer Prozess läuft noch -> sauber beenden + echo "Another instance already running (pid ${oldpid}). Exiting." >>"${LOG_FILE}" 2>&1 + return 1 + fi + fi + + # Stale Lock entfernen und erneut versuchen + echo "Stale lock detected, cleaning up..." >>"${LOG_FILE}" 2>&1 + rm -f "${PIDFILE}" 2>/dev/null + rmdir "${LOCKDIR}" 2>/dev/null + if mkdir "${LOCKDIR}" 2>/dev/null; then + echo "$$" > "${PIDFILE}" + trap 'rc=$?; rm -f "${PIDFILE}"; rmdir "${LOCKDIR}" 2>/dev/null; exit $rc' INT TERM EXIT + return 0 + else + echo "Failed to acquire lock after cleanup. Exiting." >>"${LOG_FILE}" 2>&1 + return 1 + fi +} + +# Lock holen; wenn nicht möglich, still beenden +acquire_lock || exit 0 +# --------------------------------------------------------------------------- + +# Check if configs are readable if [ ! -r "$CONF_MAIN" ]; then echo "File '$CONF_MAIN' not readable." >>"${LOG_FILE}" 2>&1 exit 2 @@ -57,8 +99,8 @@ if [ ${bootwait_count} -ge ${BOOTWAIT_MAX_COUNT} ]; then fi # prevent log file from growing too large -tail -n "${LOG_MAX_LINES}" "${LOG_FILE}" >"${LOG_FILE}.tmp" -mv "${LOG_FILE}.tmp" "${LOG_FILE}" +tail -n "${LOG_MAX_LINES}" "${LOG_FILE}" >"${LOG_FILE}.tmp" 2>/dev/null +mv "${LOG_FILE}.tmp" "${LOG_FILE}" 2>/dev/null echo "=== $(date) ===" >>"${LOG_FILE}" 2>&1 @@ -69,3 +111,4 @@ else fi wait +# Lock wird durch trap am Ende automatisch freigegeben -- cgit v1.2.3