Возможно, вы захотите совершить убийство (в конечном итоге через скрипт) в другой оболочке входа, чтобы убедиться, что вы случайно не остановили/не убили самого shell/script, пытающегося сделать общее убийство, прежде чем он завершит свое задание :)
Первый ключевой стратегией является не непосредственно завершить процесс, но:
После того, как все дерево предков на основе ppid заморожено, вы можете начать поиск и замораживание предков на основе групп процессов - вы все равно можете надежно определить эти группы процессов, если родители процессов, которые изменили свою группу процессов, все еще живы (поскольку их ppid не изменяется) - добавьте эти группы в список pgids t о быть и заморозить сбросили атомную бомбу новые PPID процесс, основанный на поддеревья вы можете найти в этих группах, как выше:
- , если их родители все еще живы, они должны быть заморожены уже как они в замороженном PPID основе родословной дерево
- , если они сироты, они будут убиты, когда весь PGID будет
сбросили атомную бомбу
Похожие процессы могут быть обнаружены с помощью идентификатора сессии в порядке, очень похожий на тот, на основе идентификатора группы (кроме убийства потребностей для выполнения pid, поскольку kill cmd поддерживает идентификатор группы, но не идентификатор сеанса).
Другим способом поиска потенциально связанных процессов будет их tty, если они есть. Но с осторожностью - они не могут быть потомками процесса, который вы хотите убить, кроме предков или сиблей. Вы все равно можете заморозить поддеревья и группы, основанные на ppid, которые вы найдете таким образом во время исследования - вы всегда можете «оттаять» их позже (с kill -CONT
), если их не нужно убивать.
Я не знаю, как найти потоки процессов потомства, разделенные процессами, объявляющими себя лидерами сеанса (таким образом изменяя их sid и pgid), если их родители умерли, и у них нет pty.
Как только весь список поддеревьев заморожен, процессы могут быть убиты (при необходимости pid или pgid) или оттаивают, чтобы продолжить их работу, если это необходимо.
Большое спасибо за совет! Мне не хватало того факта, что некоторые процессы могут порождать новые, пока мы пытаемся их прекратить. Вероятно, альтернативным способом прекращения было бы запустить дерево процессов, представляющее интерес, в отдельном сеансе (через setid) и уничтожить все процессы в сеансе. Однако это не идеально, поскольку процесс может изменить сеанс. У меня такое ощущение, что существует потребность в каком-то цикле, который бы удостоверился, что все закончилось из-за асинхронного характера сигналов. Большое спасибо за помощь! – Tomek