arc*_*oon 1 python subprocess kill
python 是否提供了一种方法来查找使用子进程生成的子进程的子进程,以便我可以正确地杀死它们?如果不是,有什么好的方法可以确保孩子的孩子被杀死?
以下内容仅适用于 Unix:
调用os.setsid()的子进程将使其成为一个新的会话和新的进程组长会议领导进程组。向进程组发送 SIGTERM 将向该子进程可能产生的所有子进程发送 SIGTERM。
您可以使用subprocess.Popen(..., preexec_fn=os.setsid). 例如:
import signal
import os
import subprocess
import time
PIPE = subprocess.PIPE
proc = subprocess.Popen('ls -laR /', shell=True,
preexec_fn=os.setsid,
stdout=PIPE, stderr=PIPE)
time.sleep(2)
os.killpg(proc.pid, signal.SIGTERM)
Run Code Online (Sandbox Code Playgroud)
运行它不会显示任何输出,但ps ax会显示子进程和ls -laR它产生的终止。
但是如果你注释掉
preexec_fn=os.setsid
Run Code Online (Sandbox Code Playgroud)
然后ps ax会显示类似的东西
% ps ax | grep "ls -la"
5409 pts/3 S 0:00 /bin/sh -c ls -laR /
5410 pts/3 R 0:05 ls -laR /
Run Code Online (Sandbox Code Playgroud)
所以没有os.setsid,ls -laR产生它的外壳仍在运行。一定要杀死他们:
% kill 5409
% kill 5410
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |