簡體   English   中英

使用子進程殺死python中的孩子的孩子

[英]Killing children of children in python with subprocess

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)

運行此命令將不顯示任何輸出,但是ps ax將顯示該子ls -laR ,並且其產生的ls -laR被終止。

但是如果你注釋掉

preexec_fn=os.setsid

然后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 /

因此,如果沒有os.setsidls -laR和產生它的shell仍在運行。 確保殺死它們:

% kill 5409
% kill 5410

並不是很容易,但是如果您的應用程序在Linux上運行,則可以遍歷/ proc文件系統並構建其PPID(父PID)與子進程相同的所有PID的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM