Как убить всех потомков текущей оболочки при прерывании?

Мои сценарии cdist-deploy-to и cdist-mass-deploy (из управления конфигурацией cdist ) выполняются в интерактивном режиме (т.е. вызываются из пользователь).

Эти сценарии вызывают множество сценариев, которые снова вызывают некоторые сценарии:

cdist-mass-deploy ...
   cdist-deploy-to ...
       cdist-explorer-run-global ...
           cdist-dir ....

Я хочу выйти / убить все сценарии, как только cdist-mass-deploy будет остановлен элементом управления C ( SIGINT) или уничтожен с помощью SIGTERM.

cdist-deploy-to также может вызываться интерактивно и должен демонстрировать такое же поведение.

Использование вариантов ps -ef ... и co для определения всех процессов с ppid выглядит как это могло быть совершенно непереносимым. Используя $!не работает, так как на более глубоких уровнях дочерние процессы не являются фоновыми процессами.

Я пробовал использовать следующий код:

__cdist_kill_on_interrupt()
{
   __cdist_tmp_removal
   kill 0
   exit 1
}

trap __cdist_kill_on_interrupt INT TERM

Но это приводит к некрасивым сообщениям Terminated, а также к segfault в оболочках (dash, bash, zsh ) и, похоже, в любом случае не останавливает все мгновенно:

# cdist-mass-deploy -p ikq04.ethz.ch ikq05.ethz.ch
core: Waiting for cdist-deploy-to jobs to finish
^CTerminated
Terminated
Terminated
Terminated
Segmentation fault

Итак, вопрос в том, как корректно выйти, включая всех (под) дочерних элементов, переносимым способом (оболочка bourne, поддержка csh не требуется)?

9
задан Nico 8 June 2011 в 08:53
поделиться