以subprocess.Popen为例:
实例时构建subprocess.Popen时会有一个shell参数,默认为False
shell=False时,命令参数必须为列表形式。
p = subprocess.Popen(['sleep', '10'], shell=False)
此时如果需要杀死进程,只需要调用kill()方法或terminate()方法,
kill()
方法会强制终止进程,并发送SIGKILL
信号;
import subprocess
import time
# 启动进程
p = subprocess.Popen(['sleep', '10'], shell=False)
# 等待 3 秒钟
time.sleep(3)
# 终止进程
p.kill()
# 等待进程结束
p.wait()
shell=True时,命令参数可使用常规的linux命令行形式。
p = subprocess.Popen('sleep 10', shell=True)
使用 shell=True
会创建一个外壳进程来解释命令行参数,而外壳进程又会创建一个子进程来执行实际的命令。因此,要杀死这种类型的进程,需要杀死外壳进程和子进程两个进程。
在 Unix 系统中,可以使用 os.killpg()
函数杀死进程组中的所有进程。进程组 ID 可以通过 Popen()
方法的 preexec_fn
参数设置。
import subprocess
import os
import signal
# 启动进程
p = subprocess.Popen('sleep 10', shell=True, preexec_fn=os.setsid)
# 等待 3 秒钟
time.sleep(3)
# 杀死进程组中的所有进程(在 Unix 系统中)
os.killpg(os.getpgid(p.pid), signal.SIGTERM)
# 等待进程结束
p.wait()
此时可以正常的杀死进程。