From b3add07ad79e36fe3dda4a206af3a36d25e84093 Mon Sep 17 00:00:00 2001 From: KorenKrita Date: Thu, 18 Jun 2026 10:11:02 +0800 Subject: [PATCH] fix: detect stale PID in runner state after abnormal shutdown (#931) * fix: verify PID belongs to hapi before treating runner as alive After OS upgrade, stale runner.state.json PID can be reused by unrelated processes. The old kill(pid, 0) check passes for any process, causing start-sync to loop with 'Runner already running' indefinitely. Now uses ps/wmic to confirm the process command line contains 'hapi' before considering the runner alive. Falls back to alive-only check if ps/wmic fails. * fix: precise runner process detection and wmic fallback * fix: add fallback for ps failure in non-Windows branch --- cli/src/runner/controlClient.ts | 8 ++++---- cli/src/utils/process.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/cli/src/runner/controlClient.ts b/cli/src/runner/controlClient.ts index b1d8de3c..fa9daa1d 100644 --- a/cli/src/runner/controlClient.ts +++ b/cli/src/runner/controlClient.ts @@ -10,7 +10,7 @@ import packageJson from '../../package.json'; import { existsSync, statSync } from 'node:fs'; import { join } from 'node:path'; import { isBunCompiled, projectPath } from '@/projectPath'; -import { isProcessAlive, killProcess } from '@/utils/process'; +import { isProcessAlive, isHapiRunnerProcess, killProcess } from '@/utils/process'; import { configuration } from '@/configuration'; import { hashRunnerCliApiToken, isRunnerStateCompatibleWithIdentity } from './runnerIdentity'; @@ -143,12 +143,12 @@ export async function checkIfRunnerRunningAndCleanupStaleState(): Promise