繁体   English   中英

发送Signal时运行代码,但不要在Ruby中捕获信号

[英]Run code when Signal is sent, but do not trap the signal in Ruby

我有一个在服务器上运行的代码,在服务器硬关闭之前,发送信号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返回前一个处理程序,因此您可以执行类似的操作

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? business是因为处理程序是可调用的或字符串( 这里记录了字符串值)。 除非你自己使用这些字符串处理程序,否则你最有可能遇到'DEFAULT',即默认的ruby行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM