2015-06-22 3 views
1

Что является лучшим способом прекратить семейство процессов в Linux, если мы предположим, что:Linux: самый надежный способ прекратить семейство процессов

  1. произвольный процесс в семье может убить/завершаясь прежде чем мы начнем очистку; в результате, если дочерние процессы не прекращаются, их PPID будет 1
  2. процессы могут изменить процесс группы

Конкретный сценарий я смотрю на это Bash, но более общий подход, то лучше.

ответ

2

Возможно, вы захотите совершить убийство (в конечном итоге через скрипт) в другой оболочке входа, чтобы убедиться, что вы случайно не остановили/не убили самого shell/script, пытающегося сделать общее убийство, прежде чем он завершит свое задание :)

Первый ключевой стратегией является не непосредственно завершить процесс, но:

  • просто «заморозить» это первый (с kill -STOP <pid>), чтобы предотвратить его от нерест других детей (необходимых для надежного определения своих детей , , иначе вы пропустите некоторые, как объяснено в этом Q & A: https://superuser.com/questions/927836/how-to-deal-with-a-memory-leaking-fork-bomb-on-linux/927967#927967)
  • добавить его в список процессов для завершения (позже)
  • найти список своих детей
  • перебирать всю историю на детей, Rince повторить

После того, как все дерево предков на основе ppid заморожено, вы можете начать поиск и замораживание предков на основе групп процессов - вы все равно можете надежно определить эти группы процессов, если родители процессов, которые изменили свою группу процессов, все еще живы (поскольку их ppid не изменяется) - добавьте эти группы в список pgids t о быть и заморозить сбросили атомную бомбу новые PPID процесс, основанный на поддеревья вы можете найти в этих группах, как выше:

  • , если их родители все еще живы, они должны быть заморожены уже как они в замороженном PPID основе родословной дерево
  • , если они сироты, они будут убиты, когда весь PGID будет
  • сбросили атомную бомбу

Похожие процессы могут быть обнаружены с помощью идентификатора сессии в порядке, очень похожий на тот, на основе идентификатора группы (кроме убийства потребностей для выполнения pid, поскольку kill cmd поддерживает идентификатор группы, но не идентификатор сеанса).

Другим способом поиска потенциально связанных процессов будет их tty, если они есть. Но с осторожностью - они не могут быть потомками процесса, который вы хотите убить, кроме предков или сиблей. Вы все равно можете заморозить поддеревья и группы, основанные на ppid, которые вы найдете таким образом во время исследования - вы всегда можете «оттаять» их позже (с kill -CONT), если их не нужно убивать.

Я не знаю, как найти потоки процессов потомства, разделенные процессами, объявляющими себя лидерами сеанса (таким образом изменяя их sid и pgid), если их родители умерли, и у них нет pty.

Как только весь список поддеревьев заморожен, процессы могут быть убиты (при необходимости pid или pgid) или оттаивают, чтобы продолжить их работу, если это необходимо.

+0

Большое спасибо за совет! Мне не хватало того факта, что некоторые процессы могут порождать новые, пока мы пытаемся их прекратить. Вероятно, альтернативным способом прекращения было бы запустить дерево процессов, представляющее интерес, в отдельном сеансе (через setid) и уничтожить все процессы в сеансе. Однако это не идеально, поскольку процесс может изменить сеанс. У меня такое ощущение, что существует потребность в каком-то цикле, который бы удостоверился, что все закончилось из-за асинхронного характера сигналов. Большое спасибо за помощь! – Tomek