Следующее относится только к 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
, что он запускается, завершается.
Но если вы закомментируете1017 *
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.setsid
, ls -laR
и оболочки, которая его породила, все еще работает.Обязательно убей их:
% kill 5409
% kill 5410