彻底杀死subprocess.Popen 执行的shell
时间: 2023-07-28 08:16:02 浏览: 133
要杀死由`subprocess.Popen`执行的shell进程,可以使用以下方法:
1. 使用`Popen`对象的`kill()`方法来杀死进程。例如:
```
import subprocess
import os
p = subprocess.Popen(['sleep', '10'])
os.kill(p.pid, signal.SIGTERM)
```
2. 使用`os.killpg()`函数来杀死进程组。例如:
```
import subprocess
import os
p = subprocess.Popen(['sleep', '10'], preexec_fn=os.setsid)
os.killpg(os.getpgid(p.pid), signal.SIGTERM)
```
注意,以上两种方法都需要导入`signal`和`os`模块。同时,如果进程在执行期间创建了子进程,那么子进程可能不会被杀死。要解决这个问题,可以使用`psutil`模块来递归杀死所有子进程。例如:
```
import subprocess
import os
import psutil
def kill_proc_tree(pid, sig=signal.SIGTERM, include_parent=True, timeout=None, on_terminate=None):
parent = psutil.Process(pid)
children = parent.children(recursive=True)
if include_parent:
children.append(parent)
for p in children:
p.send_signal(sig)
_, alive = psutil.wait_procs(children, timeout=timeout, callback=on_terminate)
return alive
p = subprocess.Popen(['sleep', '10'])
kill_proc_tree(p.pid)
```
阅读全文