fix(supervisor): pidfile lock prevents two supervisors racing on the nickname

User report 2026-05-25: launched 'npm run bot' fresh, MC server kicked
every login with "Игрок с данным никнеймом уже играет на сервере" and
the bot fell into a perpetual reconnect-then-kicked loop. Root cause:
a smoke-test supervisor from an earlier shell was still running in the
background, holding the pepa_bot session open. Two supervisors racing
on the same nickname is undefined behaviour from the server's side and
results in this exact failure mode.

Changes:

runtime/supervisor.js — acquires state/<host>/supervisor.pid before
spawning the child. If another supervisor is alive (kill -0 check), the
new one exits with a clear message telling the operator how to recover.
On SIGINT/SIGTERM/exit the lock is released; stale pidfiles are detected
when the recorded PID is no longer alive.

scripts/stop.sh — emergency cleanup helper:
  - kills any supervisor or bot.js processes matching this repo
  - removes pidfile + bot.sock
  - reminds the operator to wait ~30s for the MC server to drop the old
    session before re-launching

package.json — new `npm run stop` script.

Smoke-tested:
  - first 'node runtime/supervisor.js' acquires lock, writes pid
  - second call refuses with diagnostic message
  - first SIGTERM ⇒ pidfile removed automatically

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-25 16:47:17 +03:00
co-authored by Claude Opus 4.7
parent f5361ad9a4
commit 6d09bb6a85
3 changed files with 82 additions and 2 deletions
+2 -1
View File
@@ -14,7 +14,8 @@
"bot": "node runtime/supervisor.js",
"bot:bare": "node runtime/bot.js",
"tui": "tsx tui/tui.tsx",
"propose:apply": "node scripts/propose-apply.js"
"propose:apply": "node scripts/propose-apply.js",
"stop": "bash scripts/stop.sh"
},
"dependencies": {
"dotenv": "^16.4.5",