fix(core): kill tasks run via run-commands (#31045)

<!-- Please make sure you have read the submission guidelines before
posting an PR -->
<!--
https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr
-->

<!-- Please make sure that your commit message follows our format -->
<!-- Example: `fix(nx): must begin with lowercase` -->

<!-- If this is a particularly complex change or feature addition, you
can request a dedicated Nx release for this pull request branch. Mention
someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they
will confirm if the PR warrants its own release for testing purposes,
and generate it for you if appropriate. -->

## Current Behavior
<!-- This is the behavior we have today -->

Tasks run via `run-commands` are not cleaned up properly.

`nx serve-docs nx-dev` in this repo did not cleanup the running server
when cancelled.

## Expected Behavior
<!-- This is the behavior we should expect with the changes in this PR
-->

Tasks run via `run-commands` are cleaned up properly.

`nx serve-docs nx-dev` in this repo does clean up the running server
when cancelled.

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #
This commit is contained in:
Jason Jean 2025-05-05 13:47:18 -04:00 committed by GitHub
parent e2b27b849b
commit 5cd09f97ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -87,6 +87,7 @@ export class TaskOrchestrator {
private bailed = false;
private runningContinuousTasks = new Map<string, RunningTask>();
private runningRunCommandsTasks = new Map<string, RunningTask>();
// endregion internal state
@ -555,6 +556,11 @@ export class TaskOrchestrator {
root: workspaceRoot, // only root is needed in runCommands
} as any);
this.runningRunCommandsTasks.set(task.id, runningTask);
runningTask.onExit(() => {
this.runningRunCommandsTasks.delete(task.id);
});
if (this.tuiEnabled) {
if (runningTask instanceof PseudoTtyProcess) {
// This is an external of a the pseudo terminal where a task is running and can be passed to the TUI
@ -998,8 +1004,8 @@ export class TaskOrchestrator {
// endregion utils
private async cleanup() {
await Promise.all(
Array.from(this.runningContinuousTasks).map(async ([taskId, t]) => {
await Promise.all([
...Array.from(this.runningContinuousTasks).map(async ([taskId, t]) => {
try {
await t.kill();
this.options.lifeCycle.setTaskStatus(
@ -1011,8 +1017,15 @@ export class TaskOrchestrator {
} finally {
this.runningTasksService.removeRunningTask(taskId);
}
})
);
}),
...Array.from(this.runningRunCommandsTasks).map(async ([taskId, t]) => {
try {
await t.kill();
} catch (e) {
console.error(`Unable to terminate ${taskId}\nError:`, e);
}
}),
]);
}
private cleanUpUnneededContinuousTasks() {