aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeonard Kugis <leonard@kug.is>2025-10-14 21:19:13 +0200
committerLeonard Kugis <leonard@kug.is>2025-10-14 21:19:13 +0200
commit5bfba451f9ea6321de03839b933b4a270cfdaaa3 (patch)
tree104c7b4b6fc6b818b6d5c13225e6cc76ef84f20d
parent456bda7692c43fc6a841c74bd3d2b0a5e4f4fd48 (diff)
downloadmagisk-fstab-5bfba451f9ea6321de03839b933b4a270cfdaaa3.tar.gz
service: Added lock to prevent multiple starts of the script on startup
-rw-r--r--service.sh49
1 files changed, 46 insertions, 3 deletions
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