I use subprocess.Popen
to spawn a new child process - in this case git clone
.
The issue is that git clone
itself spawns subprocesses, and when I try to kill them using Popen.kill()
only the parent (git clone
) gets killed, but not its children.
An example of a child is:
79191 /usr/lib/git-core/git fetch-pack --stateless-rpc --stdin --lock-pack --include-tag --thin --cloning --depth=1 https://example.com/scm/adoha/adoha_digit_interpretation.git/
How can I kill all of the processes - git clone
and its children?
NB: I've thought about placing the processes in their own process group, but then the main process gets killed as well.
# execute a child process using os.execvp()
p = subprocess.Popen(shlex.split(f'git clone --bare --depth=1 -v \'{url}\' \'{temp_dir}\''),
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
try:
ret_code = p.wait(timeout)
except subprocess.TimeoutExpired as exc:
p.kill()
shutil.rmtree(temp_dir)
raise common.exc.WatchdogException(f'Failed to clone repository: Timeout.'
f'\n{timeout=}\n{url=}') from exc