Пожалуйста
Пожалуйста, следуйте @ советы СРС, чтобы определить trap
внутри case
или if
, а не наоборот.
не определенное
trap
Примечание: Это просто доказательство концепции!
Вызов Process.kill('INT', Process.pid)
внутри when "C"
будет снова попадать в trap
. Прежде всего вам необходимо определить trap
. Из documentation:
Если команда является «DEFAULT» или «SIG_DFL» рубин в обработчик по умолчанию будет вызываться.
Вот пример:
trap "SIGINT" do
mode = %w(A B C D).sample
puts "Sigint with mode : #{mode}"
case mode
when "A"
puts "A, not exiting"
when "B"
puts "B, not exiting"
when "C"
puts "C, exiting"
trap "SIGINT", "DEFAULT"
Process.kill('INT', Process.pid)
else
puts "D, exiting"
trap "SIGINT", "DEFAULT"
Process.kill('INT', Process.pid)
end
end
while true
sleep 0.1
p "+1"
end
Он выводит:
"+1"
"+1"
"+1"
^CSigint with mode : A
A, not exiting
"+1"
"+1"
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : C
C, exiting
trap_sigint.rb:21:in `sleep': Interrupt
from trap_sigint.rb:21:in `<main>'
Использование exit
Это не тот же самый сигнал, но если вы просто хотите, чтобы остановить выполнение ваш сценарий, когда режим «C» или «D», вы можете использовать exit
вместо SIGINT
:
trap "SIGINT" do
mode = %w(A B C D).sample
puts "Sigint with mode : #{mode}"
case mode
when "A"
puts "A, not exiting"
when "B"
puts "B, not exiting"
when "C"
puts "C, exiting"
exit
else
puts "D, exiting"
exit
end
end
while true
sleep 0.1
p "+1"
end
Он выводит
"+1"
"+1"
^CSigint with mode : A
A, not exiting
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : B
B, not exiting
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : D
D, exiting
Что такое ожидаемое поведение? –
Почему бы просто не заменить 'if ENV ['MODE']' с 'if ['A', 'B']. Включить ENV ['MODE']'? Но чтобы ответить на ваш вопрос - 'Process.kill ('INT', Process.pid)'. – ndn
@ EricDulusil, чтобы работать подобно вызову 'raise' из' rescue ... end'. – Nakilon