运行 发送信号时的代码,但不要在 Ruby 中捕获信号
Run code when Signal is sent, but do not trap the signal in Ruby
我的代码在服务器上 运行ning,在服务器硬关闭之前,发送了一个信号 SIGTERM
让我的代码知道它需要清理。我想在发生这种情况时编写 运行 代码并将信号发送回同一程序,以便任何其他需要清理的代码都可以这样做。我不想捕获信号或改变信号行为,我只需要 运行 在我的程序的其余部分解释 SIGTERM 之前做一些事情。
目前我可以做类似
的事情
Signal.trap('TERM') do
puts "Graceful shutdown"
exit
end
但如果同一个应用中的多段代码试图做同样的事情,它就不起作用。例如:
Signal.trap('TERM') do
puts "Graceful shutdown"
exit
end
Signal.trap('TERM') do
puts "Another graceful shutdown"
exit
end
您只会看到 "Another graceful shutdown"
而第一个代码块不会 运行。
理想情况下,我可以通过以下方式调用当前行为:
Signal.trap('TERM') do
puts "another graceful shutdown"
super
end
但由于显而易见的原因,这不起作用。所以问题是:当我得到一个 SIGTERM
时,我如何 运行 编码而不捕获它并阻止其他代码做同样的事情?
Signal.trap
returns 前一个处理程序,因此您可以执行类似
def prepend_handler(signal, &handler)
previous = Signal.trap(signal) do
previous = -> { raise SignalException, signal} unless previous.respond_to?(:call)
handler.call(previous)
end
end
prepend_handler("TERM") do |old|
do_something
old.call
end
respond_to?
业务是因为处理程序是可调用的或字符串(字符串值已记录 here)。除非你自己使用那些字符串处理程序,否则你很可能 运行 变成 'DEFAULT',即默认的 ruby 行为
我的代码在服务器上 运行ning,在服务器硬关闭之前,发送了一个信号 SIGTERM
让我的代码知道它需要清理。我想在发生这种情况时编写 运行 代码并将信号发送回同一程序,以便任何其他需要清理的代码都可以这样做。我不想捕获信号或改变信号行为,我只需要 运行 在我的程序的其余部分解释 SIGTERM 之前做一些事情。
目前我可以做类似
的事情Signal.trap('TERM') do
puts "Graceful shutdown"
exit
end
但如果同一个应用中的多段代码试图做同样的事情,它就不起作用。例如:
Signal.trap('TERM') do
puts "Graceful shutdown"
exit
end
Signal.trap('TERM') do
puts "Another graceful shutdown"
exit
end
您只会看到 "Another graceful shutdown"
而第一个代码块不会 运行。
理想情况下,我可以通过以下方式调用当前行为:
Signal.trap('TERM') do
puts "another graceful shutdown"
super
end
但由于显而易见的原因,这不起作用。所以问题是:当我得到一个 SIGTERM
时,我如何 运行 编码而不捕获它并阻止其他代码做同样的事情?
Signal.trap
returns 前一个处理程序,因此您可以执行类似
def prepend_handler(signal, &handler)
previous = Signal.trap(signal) do
previous = -> { raise SignalException, signal} unless previous.respond_to?(:call)
handler.call(previous)
end
end
prepend_handler("TERM") do |old|
do_something
old.call
end
respond_to?
业务是因为处理程序是可调用的或字符串(字符串值已记录 here)。除非你自己使用那些字符串处理程序,否则你很可能 运行 变成 'DEFAULT',即默认的 ruby 行为