diff options
| author | Leonard Kugis <leonard@kug.is> | 2025-10-14 21:19:13 +0200 |
|---|---|---|
| committer | Leonard Kugis <leonard@kug.is> | 2025-10-14 21:19:13 +0200 |
| commit | 5bfba451f9ea6321de03839b933b4a270cfdaaa3 (patch) | |
| tree | 104c7b4b6fc6b818b6d5c13225e6cc76ef84f20d | |
| parent | 456bda7692c43fc6a841c74bd3d2b0a5e4f4fd48 (diff) | |
| download | magisk-fstab-5bfba451f9ea6321de03839b933b4a270cfdaaa3.tar.gz | |
service: Added lock to prevent multiple starts of the script on startup
| -rw-r--r-- | service.sh | 49 |
1 files changed, 46 insertions, 3 deletions
@@ -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 |
