我使用subprocess.Popen
产生一个新的子进程-在本例中是git clone
。
问题是git clone
本身会生成子进程,当我尝试使用Popen.kill()
杀死它们时,只会杀死父进程(git clone
),而不会杀死它的子进程。
以下是子对象的示例:
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/
我如何杀死所有的进程-- git clone
及其子进程?
注:我考虑过将进程放在它们自己的进程组中,但是主进程也被杀死了。
# 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
发布于 2020-10-02 14:47:23
您可以使用以下代码片段终止进程及其子进程:
import psutil
def kill_process_and_children(pid: int, sig: int = 15):
try:
proc = psutil.Process(pid)
except psutil.NoSuchProcess as e:
# Maybe log something here
return
for child_process in proc.children(recursive=True):
child_process.send_signal(sig)
proc.send_signal(sig)
kill_process_and_children(p.pid)
https://stackoverflow.com/questions/64172556
复制