У меня есть программа, которая нерестится и взаимодействует с тяжелыми, нестабильными процессами процессора, которые не созданы мной. Если мое приложение разбивается или убивается SIGKILL
, я хочу, чтобы подпроцессы также были убиты, поэтому пользователю не нужно отслеживать их и убивать их вручную.
Я знаю, что эта тема была рассмотрена ранее, но я пробовал все описанные методы, и ни один из них, похоже, не выжил, чтобы выдержать тест.
Я знаю, что это возможно, поскольку терминалы делают это все время. Если я запускаю что-то в терминале и убиваю терминал, материал всегда умирает.
Я пробовал atexit
, двойную вилку и ptys
. atexit
не работает для SIGKILL
; двойная вилка не работает вообще; и ptys
Я не нашел способа работать с использованием python.
Сегодня я узнал о prctl(PR_SET_PDEATHSIG, SIGKILL)
, который должен быть способом для дочерних процессов заказывать убийство на себя, когда их родитель умирает.
Я попытался использовать его с popen
, но он не имеет никакого эффекта:
import ctypes, subprocess
libc = ctypes.CDLL('/lib/libc.so.6')
PR_SET_PDEATHSIG = 1; TERM = 15
implant_bomb = lambda: libc.prctl(PR_SET_PDEATHSIG, TERM)
subprocess.Popen(['gnuchess'], preexec_fn=implant_bomb)
В приведенном выше примере создается дочерний элемент, и родительский элемент выходит из него. Теперь вы ожидаете, что gnuchess
получит SIGKILL
и умрет, но это не так. Я все еще могу найти его в своем диспетчере процессов, используя 100% -ный процессор.
Может кто-нибудь сказать мне, если что-то не так с моим использованием prctl
?,
или вы знаете, как терминалы могут убивать своих детей?