У меня есть приложение на Linux, где я должен убить целое дерево процессов из приложения. Дерево процессов выглядит так:

app
└── parent
    ├── child1
    ├── child2
    ├── child3
    ├── child4
    └── child5

Теперь у меня возникают проблемы при уничтожении дерева процессов путем уничтожения parent: часто случается, что несколько подпроцессов не уничтожаются, когда я пытаюсь уничтожить parent процесс. После сигнала уничтожения дочерние процессы выглядят "отключенными", так как они находятся в дереве процессов, которое не находится ниже исходного app . Как это может случиться?

2 ответа2

1

Надежное уничтожение дерева процессов - дело непростое, есть несколько ошибок, например:

  • убийство родителя обычно не убивает его детей
  • Уничтожение по группам процессов обычно завершается неудачно, если процесс-убийца находится в той же группе процессов, поскольку сам убийца также уничтожается, как правило, перед завершением своей работы.
  • выявление всех потомков процесса не тривиально

Вы можете узнать мои ответы на эти более или менее связанные вопросы и ответы:

1

В целом, в системах POSIX неверно, что уничтожение родительского процесса также убивает его дочерний процесс.

Особенно , если вы используете kill -KILL после убийства дочернего процесса родительского процесса стал бесхозными процессами.

Вы можете уничтожить всю группу процессов или процессы поиска по родительскому pid, прежде чем убивать родительского. В оболочке это можно сделать с помощью:

ps --ppid <parent_pid>

В python я бы предложил использовать библиотеку psutil , особенно метод Process.children .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .