Skip to content

Commit 7c41660

Browse files
committed
fix: avoid killing stopped ios runner
1 parent d1a7641 commit 7c41660

3 files changed

Lines changed: 24 additions & 2 deletions

File tree

src/platforms/ios/runner-session.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
type ExecBackgroundResult,
77
} from '../../utils/exec.ts';
88
import { withKeyedLock } from '../../utils/keyed-lock.ts';
9-
import { isProcessAlive } from '../../utils/process-identity.ts';
9+
import { isProcessAlive, isProcessGroupAlive } from '../../utils/process-identity.ts';
1010
import type { DeviceInfo } from '../../utils/device.ts';
1111
import { buildSimctlArgsForDevice } from './simctl.ts';
1212
import {
@@ -192,7 +192,9 @@ async function stopRunnerSessionInternal(
192192
new Promise<void>((resolve) => setTimeout(resolve, RUNNER_STOP_WAIT_TIMEOUT_MS)),
193193
]);
194194
} catch {}
195-
await killRunnerProcessTree(session.child.pid, 'SIGKILL');
195+
if (isRunnerProcessTreeAlive(session.child.pid)) {
196+
await killRunnerProcessTree(session.child.pid, 'SIGKILL');
197+
}
196198
cleanupTempFile(session.xctestrunPath);
197199
cleanupTempFile(session.jsonPath);
198200
await session.simulatorSetRedirect?.release();
@@ -274,6 +276,11 @@ function isRunnerProcessAlive(pid: number | undefined): boolean {
274276
return isProcessAlive(pid);
275277
}
276278

279+
function isRunnerProcessTreeAlive(pid: number | undefined): boolean {
280+
if (!pid) return false;
281+
return isRunnerProcessAlive(pid) || isProcessGroupAlive(pid);
282+
}
283+
277284
async function killRunnerProcessTree(
278285
pid: number | undefined,
279286
signal: 'SIGINT' | 'SIGTERM' | 'SIGKILL',

src/utils/__tests__/process-identity.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import assert from 'node:assert/strict';
33
import {
44
isAgentDeviceDaemonCommand,
55
isProcessAlive,
6+
isProcessGroupAlive,
67
readProcessStartTime,
78
readProcessCommand,
89
} from '../process-identity.ts';
@@ -11,6 +12,10 @@ test('isProcessAlive returns false for invalid pid', () => {
1112
assert.equal(isProcessAlive(-1), false);
1213
});
1314

15+
test('isProcessGroupAlive returns false for invalid pid', () => {
16+
assert.equal(isProcessGroupAlive(-1), false);
17+
});
18+
1419
test('readProcessStartTime returns value for current process', () => {
1520
const startTime = readProcessStartTime(process.pid);
1621
if (startTime === null) {

src/utils/process-identity.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ export function isProcessAlive(pid: number): boolean {
1818
}
1919
}
2020

21+
export function isProcessGroupAlive(pid: number): boolean {
22+
if (!Number.isInteger(pid) || pid <= 0) return false;
23+
try {
24+
process.kill(-pid, 0);
25+
return true;
26+
} catch (err) {
27+
return (err as NodeJS.ErrnoException).code === 'EPERM';
28+
}
29+
}
30+
2131
export function readProcessStartTime(pid: number): string | null {
2232
if (!Number.isInteger(pid) || pid <= 0) return null;
2333
try {

0 commit comments

Comments
 (0)