Мои сценарии 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
Но это приводит к уродливым завершенным сообщениям, а также к 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)shell, поддержка csh не требуется)?