Как избежать зомби-процессов при убийстве рейк-задач?

У меня есть сценарий bash, который последовательно вызывает несколько грабли. Этот скрипт вызывается сервером непрерывной интеграции. Проблема в том, что если сервер интеграции убивает задачу (отправив скрипту SIGTERM), я не могу заставить все дерево процессов убить. Например, если Rake запускает набор тестов rspec с использованием функции Parallel, команда rake скрипта и верхнего уровня может быть убита, но неизбежно продолжены некоторые потоки.

До сих пор я пробовал много разных способов использования команды «trap» внутри сценария bash. Я попытался найти весь подпроцесс с помощью pstree, используя «kill -9 0», чтобы убить текущую группу процессов и т. Д. Если сценарий убит при выполнении задач рейка, он, похоже, обходит ловушку. Насколько я могу судить Rake, или, возможно, библиотеку потоков Ruby, делает что-то странное для группы процессов или, возможно, вмешивается в ловушку.

Если сценарий не находится в середине задачи рейка, он правильно поймает SIGTERM, эхо «Received SIGTERM», а затем убьет всех потомков.

Как Rake может вмешиваться в оператор ловушки в родительском процессе (скрипт bash)?

1
nl ja de

1 ответы

Bash предполагает, что вся группа процессов получила сигнал, поэтому он будет ждать завершения текущей команды, чтобы определить, что делать ( подробнее ). Ловушка не будет работать, пока команда не закончится.

Если вы не хотите ждать завершения команды, вы можете вместо этого использовать

trap 'kill $!' TERM
job &
wait $!

wait will exit immediately when the shell receives SIGTERM, causing your trap to run at once.

1
добавлено
Когда вы запускаете команды с помощью & , они должны стать новой группой процессов killable с помощью kill -TERM - $!
добавлено автор that other guy, источник
Я смог использовать это ограниченным образом. Я мог сделать это только в сценарии верхнего уровня (который напрямую получает SIGTERM). Кроме того, я все еще не мог обработать группу идентификаторов процессов, чтобы убить всех потомков (я либо ничего не убил, ни все, включая сам континуальный сервер интеграции), поэтому мне пришлось сделать уродливый «killall -9 rake» в ловушке. Тем не менее, он решает основную проблему надежного выполнения любой команды trap, поэтому я принимаю ее.
добавлено автор Peter Groves, источник
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.