diff options
Diffstat (limited to 'breaktimer.sh')
| -rwxr-xr-x | breaktimer.sh | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/breaktimer.sh b/breaktimer.sh index 4ce5a42..9a9c5fa 100755 --- a/breaktimer.sh +++ b/breaktimer.sh @@ -107,15 +107,20 @@ notify_back() { # ---------- Loop principale ---------- run_loop() { - # singleton: rifiuta se un altro daemon vivo possiede gia' il PID file. - # Evita due loop che si calpestano gli stessi file di stato. + # singleton: rivendica il PID file in modo atomico con noclobber. + # check-then-write avrebbe una finestra di race: due loop avviati insieme + # (es. doppio login) leggono entrambi un PID file stantio e partono. Con + # noclobber solo il primo crea il file; il secondo fallisce e poi decide. local owner - owner="$(cat "$PID_FILE" 2>/dev/null)" - if [ -n "$owner" ] && [ "$owner" != "$$" ] && kill -0 "$owner" 2>/dev/null; then - echo "breaktimer: gia' in esecuzione (PID $owner), run annullato" >&2 - exit 1 + if ! ( set -o noclobber; echo "$$" > "$PID_FILE" ) 2>/dev/null; then + owner="$(cat "$PID_FILE" 2>/dev/null)" + if [ -n "$owner" ] && [ "$owner" != "$$" ] && kill -0 "$owner" 2>/dev/null; then + echo "breaktimer: gia' in esecuzione (PID $owner), run annullato" >&2 + exit 1 + fi + # PID file stantio (owner morto): rivendicalo. + echo "$$" > "$PID_FILE" fi - echo "$$" > "$PID_FILE" echo "running" > "$STATE_FILE" echo "working" > "$PHASE_FILE" local count=0 |
