Убивая все процессы потомков надежно на macOS

Убивая все процессы потомков надежно на macOS

22.01.2020 09:15:19 Просмотров 27 Источник

В Linux пространства имен Pid можно использовать для надежного уничтожения всех потомственных (включая осиротевшие и зомби) процессов – см., например, этот ответ.

Какой самый близкий к "надежному" способ сделать то же самое на macOS? К сожалению, я не могу полагаться на группы процессов, поскольку некоторые из последующих процессов изменяют их.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59865941/killing-all-descendent-processes-robustly-on-macos#comment105869074_59865941
Вы пытаетесь сделать это программно (а не в оболочке)? Вы пытаетесь сделать это из процесса в корне этого под-дерева процесса или из какого-то другого процесса?
https://stackoverflow.com/questions/59865941/killing-all-descendent-processes-robustly-on-macos#comment105869112_59865941
@KenThomases программно, из процесса в корне поддерева.

Ответы - Убивая все процессы потомков надежно на macOS / Killing all descendent processes robustly on macOS

Ken Thomases

23.01.2020 04:17:21

Это грубый Клудж, но он может сработать: первый процесс откроет файловый дескриптор, так что по умолчанию все последующие процессы наследуют его. Когда он хочет убить их всех, он запускает lsof, чтобы найти все процессы с этим файлом открытым и убивает их.

pmdj

23.01.2020 12:30:25

Это не будет работать для процессов, которые отделились, но вы можете ходить по дереву дочерних процессов с помощью proc_listchildpids()и посылать сигналы каждому полученному PID. Вероятно, есть некоторые крайние случаи времени между проверкой дочерних процессов и их уничтожением - это может породить больше процессов за это время. Возможно, вы могли бы приостановить все процессы, прежде чем перечислять их детей и убивать их. Процессы, чей родитель умер, я думаю, должны быть присоединены к их дедушке или бабушке в любом случае (я могу ошибаться в этом), поэтому в этом случае, пока вы продолжаете вызывать proc_listchildpids()после отправки каждого раунда сигналов, вы должны в конечном итоге оказаться в устойчивом состоянии. (В идеале без дочерних процессов. Но если они попадают в действительно плохое состояние [из-за ошибки ядра], некоторые процессы могут быть полностью неубиваемыми.)

proc_listchildpids()объявляется в <libproc/libproc.h>.

Закрыть X