Skip to content

Terminate Windows child process tree when ExecTimeout expires. - #810

Open
copybara-service[bot] wants to merge 1 commit into
masterfrom
test_1002421541
Open

copybara-service[bot] wants to merge 1 commit into
masterfrom
test_1002421541

Conversation

@copybara-service

Copy link
Copy Markdown

Terminate Windows child process tree when ExecTimeout expires.

On Windows, os.Process.Kill() (TerminateProcess) terminates only the immediate process (cmd.Process) and leaves descendant child processes running. When helpers.ExecTimeout runs a command such as powershell.exe or dism.exe that spawns child processes (e.g. DismHost.exe) and hits conf.Timeout, the child processes remain orphaned and continue holding file and CBS/DISM locks indefinitely.

Assign started processes on Windows to a Job Object configured with JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, and terminate the Job Object (falling back to taskkill.exe /T /F /PID and proc.Kill()) when conf.Timeout expires so the entire child process tree is cleaned up.

@google-cla

google-cla Bot commented Oct 19, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

On Windows, `os.Process.Kill()` (`TerminateProcess`) terminates only the immediate process (`cmd.Process`) and leaves descendant child processes running. When `helpers.ExecTimeout` runs a command such as `powershell.exe` or `dism.exe` that spawns child processes (e.g. `DismHost.exe`) and hits `conf.Timeout`, the child processes remain orphaned and continue holding file and CBS/DISM locks indefinitely.

Assign started processes on Windows to a Job Object configured with `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE`, and terminate the Job Object (falling back to `taskkill.exe /T /F /PID` and `proc.Kill()`) when `conf.Timeout` expires so the entire child process tree is cleaned up.

PiperOrigin-RevId: 1002421541

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants