Мои сценарии 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 не требуется)?