我有一个在服务器上运行的代码,在服务器硬关闭之前,SIGTERM发送一个信号让我的代码知道它需要清理.我想在发生这种情况时运行代码并将信号发送回同一个程序,因此任何其他需要清理的代码都可以这样做.我不想捕获信号或改变信号行为,我只需要在程序的其余部分解释SIGTERM之前运行一些东西.
目前我可以做类似的事情
Signal.trap('TERM') do
puts "Graceful shutdown"
exit
end
Run Code Online (Sandbox Code Playgroud)
但是如果同一个应用程序中的多个代码试图做同样的事情,它就不起作用.例如:
Signal.trap('TERM') do
puts "Graceful shutdown"
exit
end
Signal.trap('TERM') do
puts "Another graceful shutdown"
exit
end
Run Code Online (Sandbox Code Playgroud)
您将只看到"Another graceful shutdown"并且第一个代码块将无法运行.
理想情况下,我可以通过以下方式调用当前行为:
Signal.trap('TERM') do
puts "another graceful shutdown"
super
end
Run Code Online (Sandbox Code Playgroud)
但这并不是出于显而易见的原因.所以问题是:当我得到一个SIGTERM没有捕获它并防止其他代码做同样的事情时,我如何运行代码?
Signal.trap 返回前一个处理程序,以便您可以执行类似的操作
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
Run Code Online (Sandbox Code Playgroud)
该respond_to?业务是因为处理程序可以是一个调用或一个字符串(字符串值都记录在这里).除非你自己使用这些字符串处理程序,否则你最有可能遇到'DEFAULT',即默认的ruby行为
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |