Назад | Перейти на главную страницу

Группа процессов уничтожения безопасно

Как можно безопасно убить группу процессов и при необходимости принудительно убить?

Цель состоит в том, чтобы убить с помощью SIGTERM (-15), тогда, если приложения в дереве не умирают после тайм-аута (например, 60 секунд), выполните SIGKILL (-9).

У нас есть сценарий с родительским процессом и дочерним процессом, использующим pgid, например

Parent Process pid=123, pgid=123
|- Child Process pid=456, pgid=123

В настоящее время мы отправляем SIGTERM (-15) группе процессов, а затем, если родительский процесс мертв, предполагаем успех.

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

Это сводится к двум вопросам:

  1. Почему родительский pid умирает, если ребенок не умирает (возможно ли это, или мои предположения неверны)?

  2. Будет ли проверка наличия каких-либо процессов в группе процессов лучшим способом убедиться, что все процессы в дереве мертвы, перед отправкой kill -9 группе процессов?

  1. Родитель должен явно wait () для своих потомков, если он заботится об их состоянии завершения. По умолчанию осиротевшие потомки передаются в init (pid1) и не завершаются.
  2. К сожалению, когда они принимаются init, их pgid меняется на их собственный pid (orphan становится его собственным сеансом и лидером pg).

Если вы хотите быть уверенным, вам нужно будет составить список всех PID в pg, а затем опросить, чтобы убедиться, что они умерли. Сама группа процессов распускается, когда лидер умирает, поэтому вы не можете отслеживать процессы в этом pgid.

Если вы действительно, действительно хотите быть уверенным (поскольку PID можно повторно использовать в очень загруженных системах), вам нужно будет выполнить обход дерева процессов в глубину от родительского к дочернему и убить дочерние конечные узлы, ожидая, пока каждый из них прекратите, прежде чем убить следующий уровень, но вы можете столкнуться с родителями, возрождающими своих мертвых детей. Сценарий в этот ответ на SO обрабатывает этот крайний случай.