Уничтожение всех дочерних процессов в MacOS - PullRequest
1 голос
/ 22 января 2020

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

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

Ответы [ 2 ]

2 голосов
/ 23 января 2020

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

0 голосов
/ 23 января 2020

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

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

...