Как можно безопасно убить группу процессов и при необходимости принудительно убить?
Цель состоит в том, чтобы убить с помощью SIGTERM (-15), тогда, если приложения в дереве не умирают после тайм-аута (например, 60 секунд), выполните SIGKILL (-9).
У нас есть сценарий с родительским процессом и дочерним процессом, использующим pgid, например
Parent Process pid=123, pgid=123
|- Child Process pid=456, pgid=123
В настоящее время мы отправляем SIGTERM (-15) группе процессов, а затем, если родительский процесс мертв, предполагаем успех.
Однако иногда мы обнаруживали, что родительский процесс умирает, а дочерний процесс не умирает.
Это сводится к двум вопросам:
Почему родительский pid умирает, если ребенок не умирает (возможно ли это, или мои предположения неверны)?
Будет ли проверка наличия каких-либо процессов в группе процессов лучшим способом убедиться, что все процессы в дереве мертвы, перед отправкой kill -9 группе процессов?
Если вы хотите быть уверенным, вам нужно будет составить список всех PID в pg, а затем опросить, чтобы убедиться, что они умерли. Сама группа процессов распускается, когда лидер умирает, поэтому вы не можете отслеживать процессы в этом pgid.
Если вы действительно, действительно хотите быть уверенным (поскольку PID можно повторно использовать в очень загруженных системах), вам нужно будет выполнить обход дерева процессов в глубину от родительского к дочернему и убить дочерние конечные узлы, ожидая, пока каждый из них прекратите, прежде чем убить следующий уровень, но вы можете столкнуться с родителями, возрождающими своих мертвых детей. Сценарий в этот ответ на SO обрабатывает этот крайний случай.