线程#终止并处理SIGTERM

时间:2012-12-12 23:36:59

标签: ruby multithreading signals

这是我写的一些代码的简化版本:

class InfiniteLoop
  def run
    trap('SIGTERM') do
      puts 'exiting'
      exit
    end
    loop {}
  end
end

如果我跑:

InfiniteLoop.new.run

我可以ctrl+c并获得:

exiting

然而,当我这样做时:

t = Thread.new { InfiniteLoop.new.run }
sleep 1
t.terminate

我没看到:

exiting

有人能指出我在正确的方向吗?我想在终止线程时有相同的行为。

3 个答案:

答案 0 :(得分:5)

如果您没有发送SIGTERM信号(通过ctrl + c),则不会执行陷阱块。 另请参阅内核方法:

at_exit { puts 'exiting' }

答案 1 :(得分:3)

trap('SIGTERM')只会响应从操作系统发送的信号。

Thread#terminate是会破坏线程的ruby代码。

我不知道在线程被杀死之前指定线程的行为的方法。这可能很有趣。但我不认为它存在,因为Thread#kill/terminate/join的语义不会真正允许它。

答案 2 :(得分:0)

试试trap("EXIT")。 SIGTERM由ctrl-C或kill命令发送。来自ruby docs:

  

特殊信号名称“EXIT”或信号编号0将在程序终止之前调用。