Как могут отсоединяться процессы, когда я пытаюсь их убить?

0

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

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

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

Stefan
источник

Ответы:

1

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

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

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

Dan Cornilescu
источник
Спасибо за указатели. Это заставило меня осознать несколько ключевых фактов и ошибок.
Stefan
1

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

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

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

ps --ppid <parent_pid>

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

running.t
источник
1
Также взгляните на ответы на этот вопрос.
running.t