3
我有一個程序觸發Python定時器來產生子進程。一旦我的程序被終止或終止,這些子進程應該被終止。爲了做到這一點,我使用了「prctl hack」,它設置了一旦其父母死亡,孩子應該接收哪個信號。我得到的不良行爲是:即使我的主要過程正在運行,孩子們也會被殺死。下面的代碼重現該問題:線程死時子進程死掉
from threading import Timer
import time
import os
import subprocess
import ctypes
import signal
def set_pdeathsig():
print("child PID: %d" % os.getpid())
print("child's parent PID: %d" % os.getppid())
prctl = ctypes.CDLL("libc.so.6").prctl
PR_SET_PDEATHSIG = 1
prctl(PR_SET_PDEATHSIG, signal.SIGTERM)
def thread1():
subprocess.Popen(['sleep', 'infinity'], preexec_fn=set_pdeathsig)
time.sleep(10)
print("thread 1 finished")
def thread2():
subprocess.Popen(['sleep', 'infinity'], preexec_fn=set_pdeathsig)
time.sleep(10)
print("thread 2 finished")
print("main thread PID: %d" % os.getpid())
t1 = Timer(1, thread1)
t2 = Timer(1, thread2)
t1.start()
t2.start()
time.sleep(100)
你可以注意到,線程死之前,該sleep
進程仍在運行。計時器線程死後,其各個子進程也會死掉,即使主線程還活着。
顯然,你不要調用函數'os.setpgid' –
謝謝@TheophileDano,這只是以前的測試代碼。那不應該在那裏。如果我刪除它,問題仍然存在。 –