#!/usr/bin/env bash # Lockfile helper for doorbell build harness # Source this from mise tasks LOCKFILE="/tmp/doorbell-${BOARD:-esp32-32e-4}.lock" acquire_lock() { if [ -f "$LOCKFILE" ]; then OLD_PID=$(cat "$LOCKFILE" 2>/dev/null) if [ -n "$OLD_PID" ] && kill -0 "$OLD_PID" 2>/dev/null; then if [ "${FORCE:-}" = "1" ]; then echo "Force: Killing existing process (PID: $OLD_PID)..." kill "$OLD_PID" 2>/dev/null sleep 1 kill -9 "$OLD_PID" 2>/dev/null echo "Killed PID $OLD_PID" else echo "Error: Another instance is running (PID: $OLD_PID)" echo "Kill with: mise run kill BOARD=$BOARD" echo "Or force with: FORCE=1 mise run $TASK_NAME BOARD=$BOARD" return 1 fi else echo "Stale lockfile found, removing..." rm -f "$LOCKFILE" fi fi trap 'rm -f "$LOCKFILE"' EXIT echo "$$" > "$LOCKFILE" echo "Acquired lock: $LOCKFILE (PID: $$)" return 0 } release_lock() { rm -f "$LOCKFILE" } kill_locked() { if [ ! -f "$LOCKFILE" ]; then echo "No lockfile found: $LOCKFILE (nothing to kill)" return 0 fi OLD_PID=$(cat "$LOCKFILE" 2>/dev/null) if [ -z "$OLD_PID" ]; then echo "Lockfile is empty, removing..." rm -f "$LOCKFILE" return 0 fi if kill -0 "$OLD_PID" 2>/dev/null; then echo "Killing PID $OLD_PID..." kill "$OLD_PID" 2>/dev/null sleep 1 if kill -0 "$OLD_PID" 2>/dev/null; then echo "Force killing PID $OLD_PID..." kill -9 "$OLD_PID" 2>/dev/null fi echo "Killed PID $OLD_PID" else echo "Process $OLD_PID not running (stale lockfile)" fi rm -f "$LOCKFILE" echo "Lockfile removed" }